Im Jahr 2010 stellte Stefano Palazzo eine verwandte Frage: Setzen eines beliebigen gtk.Widget in ein appindicator.Indicator und ähnliches wurde auf StackOverflow gestellt . In beiden Fällen besteht Einigkeit darüber, dass die App-Indikatoren von Ubuntu begrenzt sind. Wie Michael Ekstrand es ausdrückte:
Die Menüunterstützung von Application Indicator basiert auf D-Bus-Menüs, deren Unterstützung begrenzt ist. Sie unterstützen nur grundlegende Menüfunktionen, keine exotischen Elemente wie beliebige Widgets.
Dies widerspricht jedoch dem, was wir heute in der Bluetooth-Anzeige für 2016 sehen: Es werden Kippschalter verwendet.
Gleiches konnte mit Ubuntu One Indikator vom 13.04 beobachtet werden:
Es gibt also offensichtlich einen Weg. Ich habe Indikator-Bluetooth-Quellcode studiert, aber er ist in Vala geschrieben. Ich arbeite jedoch hauptsächlich in Python, und es ist ein bisschen zu viel Arbeit, Vala zu lernen, um alle meine bereits vorhandenen Indikatoren neu zu schreiben.
Der Kern der Frage lautet also : Wie kann man Gtk.Widgets oder zumindest einen Kippschalter wie in der Bluetooth-Anzeige mit Python verwenden?
HINWEIS : Ich bin bereit, diese Frage mit einem Kopfgeld zu belohnen, um eine Antwort zu belohnen, die ein funktionierendes Beispiel in Python liefert . Andere Sprachen werden nicht akzeptiert.
quelle
test = Gtk.CheckMenuItem("Monkey")
funktioniert das Hinzufügen eines Häkchens, aber es sollte mehr geben. Während das man arbeitet, dieser sollte funktionieren, aber nicht:Gtk.CheckMenuItemToggled("Monkey")
. Ich bin mir ziemlich sicher, dass es trotzdem funktionieren kann. Siehe: developer.gnome.org/gtk3/stable/GtkCheckMenuItem.htmlGtk.ImageMenuItem
ist veraltet und wird davon abgeraten, btw: developer.gnome.org/gtkmm/stable/deprecated.html zu verwendenAntworten:
Dieses Problem tritt auf, weil AppIndicators zwar das Erstellen eines Indikatormenüs vereinfachen, jedoch die Erstellung eines Indikatormenüs behindern. Schauen wir uns die Unterschiede zwischen dem Beispiel-Python-Code mit AppIndicator und einem mit GLib-Menüs an, wie es der Bluetooth-Code tut.
Zunächst werden Sie aufgefordert, ein zu
gtk.Menu
erstellen. Hierbei handelt es sich um Gtk-Menüobjekte im alten Stil, die verwendetGtk.Action
werden und jetzt veraltet sind. AppIndicator entnimmt Ihnen dasgtk.Menu
Objekt während desset_menu(...)
Vorgangs und analysiert es. Dabei werden die gefundenen Menüs auf den mit erstellten Indikator-Service verschobenlibdbusmenu
. Dieser Parsing-Prozess bedeutet, dass alles, was nicht von AppIndicator unterstützt wird, herausgefiltert wird, egal was Sie tun.Als nächstes schauen wir uns das Bluetooth-Menü an. Das wird mit
Gio.Menu
Objekten erstellt. Dies sind Gnome-Menüs neuen Stils, die dasGAction
System verwenden. Anschließend hat es seinen eigenen Dienst registriert, ohneAppIndicator
oder zu verwenden,libdbusmenu
und es hat mithilfe einer benutzerdefiniertenx-canonical-type
Eigenschaft festgelegt, dass das Switch-Widget erstellt wird, das zumlibido
Parsen übergeben wird.Diese ganze Übung ist ziemlich schlecht, da es sich nur um Canonicals eigene Unity-Anpassungen handelt. Sobald also die Einheit besteht, gibt es sowieso keine Indikatoren mehr.
quelle