Подтвердить что ты не робот

Как добавить элемент в GTK "недавно использованный" список файлов из Python?

Я пытаюсь добавить в список "недавно использованных" файлов из Python 3 на Ubuntu.

Я могу успешно прочитать недавно использованный список файлов, например:

from gi.repository import Gtk
recent_mgr = Gtk.RecentManager.get_default()
for item in recent_mgr.get_items():
    print(item.get_uri())

Это печатает тот же список файлов, который я вижу, когда смотрю "Недавние" в Nautilus, или смотрю на "Недавно использованное" место в диалоговом окне файлов приложений, таких как GIMP.

Однако, когда я попытался добавить такой элемент (где /home/laurence/foo/bar.txt - существующий текстовый файл)...

recent_mgr.add_item('file:///home/laurence/foo/bar.txt')

... файл не отображается в разделе "Недавние" раздела "Наутилус" или в диалоговом окне файлов. Он даже не отображается в результатах, возвращаемых get_items().

Как добавить файл в недавно использованный список файлов GTK из Python?

4b9b3361

Ответ 1

A Gtk.RecentManager должен излучать сигнал changed для обновления, которое должно быть записано в приватном атрибуте класса С++. Чтобы использовать объект 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()

Если вы не вызываете 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, если объект, из которого он вызван, равен RecentManager, и если uri не NULL; и False в противном случае.

Документация неточна, говоря:

Возвращает True, если новый элемент был успешно добавлен в список недавно использованных ресурсов

как возвращение True означает только, что асинхронная функция была вызвана для обработки добавления нового элемента.

Как было предложено Лоуренсом Гонсалвесом, следующее выполняется псевдосинхронно:

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()