it-swarm.com.de

Wie programmiere ich ein Statussymbol, das sowohl in Ubuntu als auch in anderen Distributionen angezeigt wird?

Die betreffende Anwendung führt eine Aktion aus (hier Verbinden von Audio mit Netzwerkströmen) und wird minimiert ausgeführt, wenn diese Aktionen erfolgreich waren. Daher wird ein Statussymbol benötigt, um den Status der Verbindung anzuzeigen (z. B. VERBUNDEN/TRENNEN). Erst wenn Sie auf das Symbol klicken, wird das Anwendungsfenster geöffnet, in dem Sie auf weitere Optionen zugreifen können.

Mit Python 2.6 und pyGtk habe ich dies bequem mit gtk_status_icon realisiert. Ich habe die Anwendung absichtlich so geschrieben, dass sie auf so vielen Distributionen wie möglich läuft, einschließlich der verschiedenen Ubuntu-Versionen. Ich habe darauf geachtet, mögliche Abhängigkeiten erst zu verwenden, nachdem der Benutzer sie installiert hat.

Jetzt höre ich jedoch, dass gtk_status_icon in zukünftigen Ubuntu-Versionen nicht mehr unterstützt wird. Entwickler werden gebeten, stattdessen Anwendungsindikatoren zu verwenden. Was ist dann die beste Vorgehensweise, um sicherzustellen, dass:

  1. Die lokalen Symbole der Anwendung werden ordnungsgemäß angezeigt
  2. Die Anwendung wird weiterhin ausgeführt und zeigt ihre Symbole in zukünftigen Ubuntu-Versionen an.
  3. Die Anwendung wird auch ausgeführt und zeigt ihre Symbole in anderen Umgebungen an, in denen Indikator-Applet , libappindicator und python-appindicator werden nicht bereitgestellt.

Anwendungsindikator-Fallback-Mechanismen für gtk_status_icon funktionieren nicht, wenn das Indikator-Applet nicht ausgeführt wird. Python -Interpreter werden nicht ausgeführt, wenn kein Appindicator-Modul zum Import vorhanden ist. Muss ich verschiedene Versionen für verschiedene Distributionen entwickeln oder gibt es einen besseren Weg, dies zu umgehen?.

Wo finde ich eine andere Dokumentation zur Verwendung von ApplicationIndicator als in dem Beispiel in buntu Wiki ? Welche Befehle werden bereitgestellt, um zu überprüfen, ob das Anzeige-Applet ausgeführt wird, um zu vermeiden, dass unterschiedliche Quellcodes für Ubuntu-Distributionen im Vergleich zu Nicht-Ubuntu-Distributionen programmiert werden?

23
Takkat

Ich denke, dass das Bedürfnis hier eigentlich eher die Bestimmung der Python-Appindicator-Bibliothek ist. Wenn es vorhanden ist, werden alle von Ihnen benötigten Fallback-Fälle unterstützt. Es wird XFCE, KDE und älteres GNOME angemessen behandeln. Gutes Beispiel dafür, wie es in dieser Antwort gemacht wird .

Die Anwendungsindikatorbibliothek verwendet DBus, um zu überprüfen, ob der Anwendungsindikator-Rendervorgang verfügbar ist. Dies ist bei Unity der Fall oder wenn das Indikator-Applet ausgeführt wird. Wenn es verfügbar ist, wird es das verwenden, wenn nicht, wird es auf die Verwendung eines GtkStatusIcon mit demselben Menü zurückgreifen.

Leider glaube ich, dass Sie beide Codepfade beibehalten müssen, wenn Sie den Fall behandeln möchten, dass die Bibliothek nicht verfügbar ist. Wir würden uns freuen, die Bibliothek in anderen Distributionen zu finden :)

16
Ted Gould

Ich habe eine ausgezeichnete Lösung, die in StackApplet gut funktioniert hat. Ich habe eine funktionsäquivalente Version des Moduls appindicator erstellt, die gtk.StatusIcon intern verwendet, um eine identische Version bereitzustellen Funktionalität, wenn das reale Modul nicht existiert.

Die Benutzung ist so einfach wie:

  1. Lade die folgende Datei herunter und nenne sie appindicator_replacement.py
  2. Fügen Sie Ihrer Bewerbung Folgendes hinzu:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator
    

Das war's! Jetzt läuft Ihre Anwendung perfekt mit oder ohne Unterstützung für AppIndicators. Es läuft sogar unter Windows, vorausgesetzt, Sie haben keinen anderen plattformspezifischen Code.


Hinweis: Die Datei wird unter der Lizenz MIT veröffentlicht - Sie können sie also für so ziemlich alles verwenden.

10
Nathan Osman

Sie müssen Code für beide schreiben. Sie können das Vorhandensein von appindicator in Ihrem Python Code mit etwas ähnlichem feststellen:

have_appindicator = True
try:
    import appindicator
except:
    have_appindicator = False

Verwenden Sie von dort aus have_appindicator, um zu entscheiden, ob Sie den appindicator-Code oder den gtk_status_icon-Code verwenden möchten.

Leider bedeutet dies auch, dass Sie sowohl Ubuntu als auch eine andere Umgebung zum Testen benötigen.

9
jgoguen
for line in os.popen("ps xa"): 
fields = line.split() 
pid = fields[0] 
process = fields[4]

applet_is_running = ( process.find('indicator-applet') > 0 )

Auf diese Weise können Sie feststellen, ob das Indikator-Applet ausgeführt wird. Sie müssen sich keine Sorgen um Ubuntu 11.04 machen, da dies nicht der Fall sein wird. Es gibt kein Fallback-Szenario, da das Indikator-Applet eine obligatorische Komponente ist, die standardmäßig ausgeführt wird.

3
OpenNingia