Comment programmer une icône d'état qui s'affichera dans Ubuntu ainsi que dans d'autres distributions?

23

L’application en question effectue certaines actions (en connectant ici l’audio aux flux réseau) et s’exécute si ces actions aboutissent. Par conséquent, une icône d'état est nécessaire pour afficher l'état de la connexion (par exemple, CONNECTED / DISCONNECTED). Ce n’est que lorsque l’on clique sur l’icône que la fenêtre d’application s’ouvre pour donner accès à d’autres options.

En utilisant Python 2.6 et pyGtk, j'ai réalisé cela de manière pratique en utilisant gtk_status_icon . J'ai délibérément écrit l'application pour exécuter sur autant de distributions que possible, y compris les différentes versions d'Ubuntu. J'ai pris soin d'utiliser les dépendances possibles seulement après que l'utilisateur les ait installées.

Mais maintenant, j'entends que gtk_status_icon ne sera plus supporté dans les futures versions d’Ubuntu. Les développeurs sont invités à utiliser les indicateurs d'application à la place. Quelle est alors la meilleure pratique pour vous assurer que:

  1. Les icônes locales de l'application sont affichées correctement
  2. L'application sera toujours exécutée et affichera ses icônes dans les futures versions d'Ubuntu.
  3. L’application va exécuter et afficher les icônes dans d’autres environnements où applet-indicateur , libappindicator et python-appindicator ne sont pas fournis.

Les mécanismes de repli de l'indicateur d'application vers gtk_status_icon ne fonctionneront pas si l'applet de l'indicateur n'est pas en cours d'exécution. Les interpréteurs Python ne s'exécuteront pas s'il n'y avait pas de module appindicator à importer. Dois-je développer différentes versions pour différentes distributions ou existe-t-il un meilleur moyen de contourner ce problème?

Où puis-je trouver une documentation sur l'utilisation d'ApplicationIndicator autre que dans l'exemple donné dans Wiki Ubuntu ? Quelles commandes sont fournies pour vérifier si l'applet indicateur est en cours d'exécution pour éviter de programmer différents codes sources pour les distributions Ubuntu et non-Ubuntu?

    
posée Takkat 14.11.2010 - 13:56
la source

4 réponses

16

Je pense que le besoin ici est en fait plus déterminant que la bibliothèque python-appindicator est présente. S'il est présent, il prendra en charge tous les cas de retour dont vous avez besoin. Il traitera correctement XFCE, KDE et les anciens GNOME. Un bon exemple de la façon de procéder dans cette réponse .

La bibliothèque d’indicateurs utilisera DBus pour vérifier si le processus de rendu des indicateurs d’application est disponible. Ce sera le cas sur Unity ou si l'applet indicateur est en cours d'exécution. S'il est disponible, il l'utilisera sinon, il utilisera un GtkStatusIcon avec le même menu.

Malheureusement, je pense que vous devriez garder les deux chemins de code si vous voulez gérer le cas où la bibliothèque n'est pas disponible. Cependant, nous serions heureux d’aider à mettre la bibliothèque dans d’autres distributions:)

    
réponse donnée Ted Gould 15.11.2010 - 16:42
la source
10

J'ai une excellente solution qui a bien fonctionné dans StackApplet - j'ai créé une version fonctionnellement équivalente du module appindicator qui utilise gtk.StatusIcon en interne pour fournir des fonctionnalités identiques lorsque le module réel n'existe pas.

L’utiliser est aussi simple que:

  1. Téléchargez le fichier et appelez-le appindicator_replacement.py
  2. Ajout des éléments suivants à votre application:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator
    

Ça y est! Votre application fonctionnera désormais parfaitement avec ou sans support pour AppIndicators. Il s'exécutera même sous Windows, à condition que vous n'ayez pas d'autre code spécifique à la plate-forme.

Remarque: le fichier est publié sous la licence MIT - vous pouvez donc l'utiliser à peu près n'importe quoi.

    
réponse donnée Nathan Osman 11.05.2011 - 02:04
la source
9

Vous devrez écrire du code pour les deux. Vous pouvez détecter la présence de l’indicateur dans votre code Python en utilisant quelque chose de similaire à:

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

A partir de là, utilisez has_appindicator pour décider si vous devez utiliser le code appindicator ou le code gtk_status_icon.

Malheureusement, cela signifie également que vous devrez tester Ubuntu et un autre environnement.

    
réponse donnée jgoguen 14.11.2010 - 15:06
la source
3
for line in os.popen("ps xa"): 
fields = line.split() 
pid = fields[0] 
process = fields[4]

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

De cette façon, vous pouvez détecter si l’applet indicateur est actif. Vous n'avez pas à vous soucier d'Ubuntu 11.04 car ce ne sera pas le cas. Il n'y a pas de scénario de repli parce que l'applet indicateur est un composant obligatoire, exécuté par défaut.

    
réponse donnée OpenNingia 15.11.2010 - 10:28
la source

Lire d'autres questions sur les étiquettes