2016-10-03 9 views
13

Próbuję dodać do listy ostatnio używanych plików z Python 3 na Ubuntu.Jak dodać pozycję do "ostatnio używanej" listy plików GTK z Pythona?

Jestem w stanie skutecznie czytać lista ostatnio używanych plików tak:

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

ten drukuje taką samą listę plików widzę, gdy patrzę na „Najnowsze” Nautilusa, lub spojrzeć na miejsce "Ostatnio używane" w oknie dialogowym plików aplikacji takich jak GIMP.

Jednak gdy próbowałem dodanie elementu tak (gdzie /home/laurence/foo/bar.txt jest istniejący plik tekstowy) ...

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

... plik nie pojawi się w ostatnim odcinku lub w Nautilusie okna dialogowe plików. Nie pojawia się nawet w wynikach zwróconych przez get_items().

Jak mogę dodać plik do ostatnio używanej listy plików GTK z Pythona?

+1

@oldtechaa liście ostatnich plików widzianych przez Nautilusa i okna wyboru plików w innych aplikacjach (w tym GIMP, Inkscape, a nawet Chrome) wydają się być identyczne. Wiele aplikacji domyślnie filtruje listę do ich własnego typu pliku, ale jeśli zmienisz filtr na "Wszystkie pliki", zobaczysz dokładnie tę samą listę, którą pokazuje Nautilus, i która jest wyświetlana przez kod w pytaniu. –

+0

Co zwraca 'add_item()'? – andlabs

+0

@andlabs Wywołanie 'add_item()' zwraca 'True'. (Właściwie, wydaje się, że zawsze zwraca 'True', nawet jeśli identyfikator URI, który mu przekazuję, jest nieistotny lub kompletny nonsens.) Jedynym wyjątkiem jest, jeśli przekazuję go nie -strstr." Następnie podnosi "TypeError".) –

Odpowiedz

12

A Gtk.RecentManager musi emitować sygnał changed, aby aktualizacja została zapisana w prywatnym atrybucie klasy C++. Aby użyć RecentManager obiektu w aplikacji, trzeba uruchomić pętlę zdarzeń poprzez wywołanie 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() 

Jeśli nie zadzwonić Gtk.main() sygnał changed nie jest emitowany i nic się nie dzieje.

Aby odpowiedzieć na zapytanie @andlabs, powodem, dla którego RecentManager.add_item zwraca wartość boolean, jest wywoływana funkcja g_file_query_info_async. Funkcja wywołania zwrotnego gtk_recent_manager_add_item_query_info następnie gromadzi typ MIME, nazwę aplikacji i polecenie w strukturze GtkRecentData i ostatecznie wywołuje gtk_recent_manager_add_full. Źródłem jest here.

Jeśli coś pójdzie nie tak, to dobrze po add_item zakończył, więc metoda po prostu zwraca True jeśli obiekt jest nazywany ze jest RecentManager a jeżeli URI nie jest NULL; i inaczej: False.

Dokumentacja jest niedokładna, mówiąc:

Returns TRUE jeśli nowy artykuł został dodany do listy zasobów ostatnio używanych

jako powrót TRUE tylko oznacza, że ​​funkcja asynchroniczna została wezwana do radzić sobie z dodaniem nowego przedmiotu.

Jak sugeruje Laurence Gonsalves następujące biegnie pseudo-synchronicznie:

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() 
Powiązane problemy