試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

PyGTKで最近開いたファイルを記憶する

最近開いたファイルを管理するオブジェクト

バージョン2.10以上のGTK+ではファイル選択ダイアログの中で最近開いたファイルを一覧してその中から項目を選択することができるようになっている。

「最近開いたファイル」という項目が左上にある
ところが、GTK+アプリケーションを作成する中で普通にgtk.FileChooserDialogオブジェクトなどによりファイル選択ダイアログを呼び出してファイルを開いてもその項目は記憶されない。

最近開いたファイルを追加するにはgtk.RecentManagerオブジェクトを使用する。バージョン2.10以上のPyGTKでのみ利用可能。

最近開いたファイル一覧への追加方法

  1. gtk.recent_manager_get_default()関数によりgtk.RecentManagerオブジェクトを得る
  2. メンバ関数add_item()URIとしてファイルの場所を渡す

注意点は、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:

使用したバージョン:

  • PyGTK 2.13.0
  • GTK+ 2.14.3