PyGTKで最近開いたファイルを記憶する
最近開いたファイルを管理するオブジェクト
バージョン2.10以上のGTK+ではファイル選択ダイアログの中で最近開いたファイルを一覧してその中から項目を選択することができるようになっている。
「最近開いたファイル」という項目が左上にある
ところが、GTK+アプリケーションを作成する中で普通にgtk.FileChooserDialogオブジェクトなどによりファイル選択ダイアログを呼び出してファイルを開いてもその項目は記憶されない。
最近開いたファイルを追加するにはgtk.RecentManagerオブジェクトを使用する。バージョン2.10以上のPyGTKでのみ利用可能。
最近開いたファイル一覧への追加方法
注意点は、add_item()の引数が「file://」に続く形での指定となるところ。
保存ファイル
GTK+上の「最近開いたファイル」一覧は${HOME}/.recently-used.xbelというファイルに保存されているようだ。
なお、最近開いたファイルが保存されるのが嫌というのであれば
http://mstssk.blogspot.com/2008/08/recently-used.html
のようにしてこのファイルが書き込まれないようにするとよいらしい。
テストの例
#! /usr/bin/python # -*- encoding: utf-8 -*- import sys try: import pygtk pygtk.require('2.0') except: pass try: import gtk except: print >> sys.stderr, 'Error: PyGTK is not installed' sys.exit(1) if gtk.pygtk_version < (2,10,0): errmsg = 'PyGTK >= 2.10.0 required' if gtk.pygtk_version < (2,4,0): print >> sys.stderr, errmsg else: errdlg = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK, message_format=errmsg) errdlg.set_title('This program cannot be run') errdlg.run() sys.exit(1) class MainWindow(gtk.Window): """ メインウィンドウ """ def __init__(self, *args, **kwargs): gtk.Window.__init__(self, *args, **kwargs) # ショートカットキー(アクセラレータ) self.accelgroup = gtk.AccelGroup() self.add_accel_group(self.accelgroup) # メニュー項目 self.item_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT, self.accelgroup) self.menu_file = gtk.Menu() self.menu_file.add(self.item_quit) self.item_file = gtk.MenuItem('_File') self.item_file.set_submenu(self.menu_file) self.menubar = gtk.MenuBar() self.menubar.append(self.item_file) # ボタン self.button = gtk.Button('Select a _file') # レイアウト用コンテナ self.vbox = gtk.VBox() self.vbox.pack_start(self.menubar, expand=False, fill=False) self.vbox.pack_start(self.button) # シグナル self.connect('delete_event', gtk.main_quit) self.item_quit.connect('activate', gtk.main_quit) self.button.connect('clicked', self.on_button_clicked) # ウィンドウ self.add(self.vbox) self.set_size_request(200, 150) # 最近開いた項目の管理 self.recents = gtk.recent_manager_get_default() def on_button_clicked(self, widget): """ ボタンがクリックされたときの処理 """ chooserdlg = gtk.FileChooserDialog(title='Open file', action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) chooserdlg.set_local_only(True) response = chooserdlg.run() infile = chooserdlg.get_filename() chooserdlg.destroy() if response == gtk.RESPONSE_OK: try: f_in = open(infile, 'r') # 正常にファイルが開けたら「最近開いたファイル」に追加する self.recents.add_item('file://' + infile) f_in.close() except IOError, (errno, msg): errdlg = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK, message_format='Cannot open file %s: %s' % (infile, msg)) errdlg.set_title('Open failed') errdlg.run() errdlg.destroy() class RecentManagerTest: """ 最近開いたファイルのテスト """ def main(self): """ アプリケーションのメイン処理 """ win = MainWindow() win.show_all() gtk.main() if __name__ == '__main__': app = RecentManagerTest() app.main()
ボタンを押してからファイルを選択すると、その後でファイル選択ダイアログを開いたときに
一覧から呼び出せる。
関連記事:
参考URL:
関連URL:
- http://mail.gnome.org/archives/gnome-announce-list/2006-July/msg00003.html - GTK+ 2.10がリリースされたときの変更点一覧を含む
使用したバージョン:
- PyGTK 2.13.0
- GTK+ 2.14.3