Korzystanie z Gtk.Widgets we wskaźnikach aplikacji w Pythonie

44

W 2010 roku Stefano Palazzo zadał powiązane pytanie: Umieszczanie arbitralnego gtk.Widget w appindicator.Indicator , i podobne pytanie zadawano na StackOverflow . W obu przypadkach konsensus jest taki, że wskaźniki aplikacji Ubuntu są ograniczone. Jak ujął to Michael Ekstrand:

Obsługa menu wskaźnika aplikacji opiera się na menu D-Bus, które są ograniczone w tym, co obsługują - obsługują tylko podstawowe funkcje menu, a nie bardziej egzotyczne rzeczy, takie jak arbitralne widżety.

Jest to jednak sprzeczne z tym, co widzimy dzisiaj we wskaźniku Bluetooth, w 2016 r .: używa przełączników przełączających.

wprowadź opis zdjęcia tutaj

To samo można zaobserwować w przypadku wskaźnika Ubuntu One z 13.04:

wprowadź opis zdjęcia tutaj

Więc oczywiście jest sposób. Studiowałem kod źródłowy wskaźnik-bluetooth, ale jest napisany w Vala. Ja jednak pracuję przede wszystkim w Pythonie, a nauka Vali, aby przepisać wszystkie moje już istniejące wskaźniki, jest trochę za dużo pracy.

Tak więc sedno pytania: w jaki sposób można używać Gtk.Widgets, a przynajmniej przełącznika tak jak na wskaźniku Bluetooth, używając Pythona?

UWAGA : Jestem gotów wystawić nagrodę za to pytanie, aby nagrodzić odpowiedź, która zapewni działający przykład w pythonie . Inne języki nie są akceptowane.

Sergiy Kolodyazhnyy
źródło
6
Wskaźnik aplikacji jest ograniczony, nawet nie obsługuje ikony w locie (tylko ładuje plik obrazu z systemu plików). Wskaźniki, o których wspomniałeś, to wskaźniki SYSTEM (bluetooth, ubuntu one, dźwięk, moc, ...). Są różne i nie używają libappindicatora. Opublikowałem już kilka postów, które mogą pomóc wyjaśnić różnicę. Mam już wskaźnik systemu działający przy użyciu C., ale w Pythonie wciąż mam problemy.
user.dz
2
Czy istnieje sposób na zwrócenie uwagi głównych deweloperów Ubuntu na to pytanie?
don.joey
1
Przynajmniej test = Gtk.CheckMenuItem("Monkey")działa dodawanie przycisku wyboru, ale powinno być więcej. Mimo, że ktoś pracuje, ten powinien działać, ale nie: Gtk.CheckMenuItemToggled("Monkey"). Jestem prawie pewien, że i tak może działać. Patrz: developer.gnome.org/gtk3/stable/GtkCheckMenuItem.html
Jacob Vlijm
1
@JacobVlijm tak, dodanie jednego pojedynczego menuitem działa, działa również, aby dodać Gtk.Box i dodać Gtk.Label do tego pola, ale nic więcej (mówi, że widget może zawierać tylko jeden element.
Sergiy Kolodyazhnyy
1
Gtk.ImageMenuItemjest przestarzałe i odradzane używanie btw: developer.gnome.org/gtkmm/stable/deprecated.html
Jacob Vlijm,

Odpowiedzi:

1

Ten problem istnieje, ponieważ chociaż AppIndicators ułatwiają tworzenie menu wskaźników, przeszkadzają w jego tworzeniu. Spójrzmy na różnice między przykładowym kodem Pythona używającym AppIndicatora a jednym korzystającym z menu GLib, tak jak robi to kod Bluetooth.

Po pierwsze, poinstruowano cię, aby zrobić gtk.Menu, są to obiekty menu Gtk w starym stylu, które używają, Gtk.Actionktóre są teraz przestarzałe. AppIndicator pobiera gtk.Menuobiekt od Ciebie podczas set_menu(...)procesu i analizuje go, wypychając każde znalezione menu do usługi wskaźnika utworzonej za pomocą libdbusmenu. Ten proces analizowania oznacza, że ​​wszystko, co nie jest obsługiwane przez AppIndicator, jest filtrowane, bez względu na to, co robisz.

Następnie spójrzmy na menu Bluetooth. To jest tworzone przy użyciu Gio.Menuobiektów, są to menu Gnome w nowym stylu korzystające z GActionsystemu. Następnie zarejestrował własną usługę bez użycia AppIndicatorlub libdbusmenui ustawia ją za pomocą x-canonical-typewłaściwości niestandardowej, aby utworzyć widget przełączania, który jest przekazywany do libidoanalizy.

Całe to ćwiczenie jest dość złe, ponieważ wszystkie dostosowania Unity firmy Canonical są wszystkie. Więc jak tylko zejdzie jedność, i tak nie ma żadnych wskaźników.

Martin Owens -doctormo-
źródło