如何将一个项目添加到GTK的"最近使用的"文件列表中?

Lau*_*ves 17 python gtk pygtk gtk3

我正在尝试在Ubuntu上添加Python 3中的"最近使用的"文件列表.

我能够成功读取最近使用的文件列表,如下所示:

from gi.repository import Gtk
recent_mgr = Gtk.RecentManager.get_default()
for item in recent_mgr.get_items():
    print(item.get_uri())
Run Code Online (Sandbox Code Playgroud)

这会打印出我在Nautilus中查看"Recent"时看到的相同文件列表,或者查看GIMP等应用程序文件对话框中的"最近使用"位置.

但是,当我尝试添加这样的项目时(/home/laurence/foo/bar.txt现在的文本文件在哪里)...

recent_mgr.add_item('file:///home/laurence/foo/bar.txt')
Run Code Online (Sandbox Code Playgroud)

...文件未显示在Nautilus的最近部分或文件对话框中.它甚至没有显示在返回的结果中get_items().

如何从Python中将文件添加到GTK最近使用的文件列表中?

Jac*_*din 15

Gtk.RecentManager需要发出changed用于要被写入在C++类的私有属性更新信号.要RecentManager在应用程序中使用对象,您需要通过调用Gtk.main以下命令来启动事件循环:

from gi.repository import Gtk

recent_mgr = Gtk.RecentManager.get_default()
uri = r'file:/path/to/my/file'
recent_mgr.add_item(uri)
Gtk.main()
Run Code Online (Sandbox Code Playgroud)

如果您不打电话Gtk.main(),changed则不会发出信号且没有任何反应.

要回答@andlabs查询,RecentManager.add_item返回布尔值的原因是因为g_file_query_info_async函数被调用.然后,回调函数gtk_recent_manager_add_item_query_info将mimetype,应用程序名称和命令收集到GtkRecentData结构中,最后调用gtk_recent_manager_add_full.来源就在这里.

如果出现任何问题,它在add_item完成之后就好了,所以True如果调用它的对象是a RecentManager而且uri不是,那么方法就会返回NULL; 和False其他.

文档说不准确:

返回TRUE如果新项目已成功添加到最近使用的资源列表

返回TRUE仅表示调用异步函数来处理新项的添加.

正如Laurence Gonsalves所建议的,以下伪同步运行:

from gi.repository import Gtk, GObject

recent_mgr = Gtk.RecentManager.get_default()
uri = r'file:/path/to/my/file'
recent_mgr.add_item(uri)
GObject.idle_add(Gtk.main_quit)
Gtk.main()
Run Code Online (Sandbox Code Playgroud)