Verwenden von Gtk.Widgets in App-Indikatoren mit Python

44

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.

Bildbeschreibung hier eingeben

Gleiches konnte mit Ubuntu One Indikator vom 13.04 beobachtet werden:

Bildbeschreibung hier eingeben

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.

Sergiy Kolodyazhnyy
quelle
6
Der Anwendungsindikator ist begrenzt, unterstützt jedoch kein Symbol im laufenden Betrieb (es wird nur die Bilddatei aus dem Dateisystem geladen). Die von Ihnen erwähnten Anzeigen sind SYSTEM-Anzeigen (Bluetooth, Ubuntu One, Sound, Power, ...). Sie sind unterschiedlich und verwenden libappindicator nicht. Ich habe bereits einige Posts veröffentlicht, die helfen können, den Unterschied zu verdeutlichen. Ich habe bereits einen Systemindikator, der mit C funktioniert, aber in Python habe ich immer noch Probleme.
user.dz
2
Gibt es eine Möglichkeit, die Aufmerksamkeit der Ubuntu-Core-Entwickler auf diese Frage zu lenken?
don.joey
1
Zumindest 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.html
Jacob Vlijm
1
@JacobVlijm Ja, das Hinzufügen eines einzelnen Menüs funktioniert, es funktioniert auch, um eine Gtk.Box und ein Gtk.Label in diese Box einzufügen, aber sonst nichts (laut Widget kann nur ein Element enthalten.
Sergiy Kolodyazhnyy 8.10.16
1
Gtk.ImageMenuItemist veraltet und wird davon abgeraten, btw: developer.gnome.org/gtkmm/stable/deprecated.html zu verwenden
Jacob Vlijm

Antworten:

1

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.Menuerstellen. Hierbei handelt es sich um Gtk-Menüobjekte im alten Stil, die verwendet Gtk.Actionwerden und jetzt veraltet sind. AppIndicator entnimmt Ihnen das gtk.MenuObjekt während des set_menu(...)Vorgangs und analysiert es. Dabei werden die gefundenen Menüs auf den mit erstellten Indikator-Service verschoben libdbusmenu. 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.MenuObjekten erstellt. Dies sind Gnome-Menüs neuen Stils, die das GActionSystem verwenden. Anschließend hat es seinen eigenen Dienst registriert, ohne AppIndicatoroder zu verwenden, libdbusmenuund es hat mithilfe einer benutzerdefinierten x-canonical-typeEigenschaft festgelegt, dass das Switch-Widget erstellt wird, das zum libidoParsen ü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.

Martin Owens -doctormo-
quelle