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.
To samo można zaobserwować w przypadku wskaźnika Ubuntu One z 13.04:
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.
źródło
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.htmlGtk.ImageMenuItem
jest przestarzałe i odradzane używanie btw: developer.gnome.org/gtkmm/stable/deprecated.htmlOdpowiedzi:
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.Action
które są teraz przestarzałe. AppIndicator pobieragtk.Menu
obiekt od Ciebie podczasset_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.Menu
obiektów, są to menu Gnome w nowym stylu korzystające zGAction
systemu. Następnie zarejestrował własną usługę bez użyciaAppIndicator
lublibdbusmenu
i ustawia ją za pomocąx-canonical-type
właściwości niestandardowej, aby utworzyć widget przełączania, który jest przekazywany dolibido
analizy.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.
źródło