Come programmare un'icona di stato che verrà visualizzata in Ubuntu e in altre distribuzioni?


23

L'applicazione in questione esegue alcune azioni (qui collegando l'audio ai flussi di rete) e viene minimizzata se queste azioni hanno esito positivo. Pertanto è necessaria un'icona di stato per visualizzare lo stato della connessione (ad es. CONNECTED / DISCONNECTED). Solo quando si fa clic sull'icona si aprirà la finestra dell'applicazione per consentire l'accesso a ulteriori opzioni.

Usando Python 2.6 e pyGtk me ne sono reso conto convenientemente usando gtk_status_icon . Ho deliberatamente scritto l'applicazione per eseguire il maggior numero possibile di distribuzioni, comprese le varie versioni di Ubuntu. Mi sono preso cura di utilizzare le possibili dipendenze solo dopo che l'utente le aveva installate.

Tuttavia ora sento che gtk_status_icon non sarà più supportato nelle future versioni di Ubuntu. Gli sviluppatori sono invece invitati a utilizzare gli Indicatori di applicazione. Quali sono le migliori pratiche per assicurarsi che:

  1. Le icone locali dell'applicazione sono visualizzate correttamente
  2. L'applicazione continuerà a funzionare e visualizzerà le sue icone nelle future versioni di Ubuntu.
  3. L'applicazione verrà inoltre eseguita e visualizzerà le sue icone in altri ambienti in cui non sono forniti indicatore-applet , libappindicator e python-appindicator .

I meccanismi di fallback dell'indicatore dell'applicazione su gtk_status_icon non funzioneranno se l' indlet-applet non è in esecuzione. Gli interpreti Python non verranno eseguiti se non era presente un modulo appindicator da cui importare. Devo sviluppare versioni diverse per diverse distribuzioni o c'è un modo migliore per aggirare questo.

Dove trovo una documentazione su come usare ApplicationIndicator oltre a quella dell'esempio fornito in Ubuntu Wiki ? Quali comandi vengono forniti per verificare se la applet indicatore è in esecuzione per evitare di programmare codici sorgente diversi per le distribuzioni Ubuntu vs non Ubuntu?

Risposte:


16

Penso che la necessità qui sia in realtà più determinante della libreria python-appindicator presente. Se presente, supporterà tutti i casi di fallback necessari. Gestirà XFCE, KDE e GNOME precedenti in modo appropriato. Un buon esempio di come farlo in questa risposta .

La libreria dell'appindicator utilizzerà DBus per verificare se il processo di rendering dell'indicatore dell'applicazione è disponibile. Questo sarà il caso di Unity o se l'applet indicatore è in esecuzione. Se è disponibile, lo utilizzerà, in caso contrario, ricadrà sull'uso di GtkStatusIcon con lo stesso menu.

Sfortunatamente, credo che dovresti mantenere entrambi i percorsi del codice se vuoi gestire il caso in cui la libreria non è disponibile. Tuttavia, saremo felici di aiutarti a ottenere la biblioteca in altre distro :)


Grazie per questa risposta molto chiara. Questo indica il percorso che dovrò percorrere se voglio che la mia app sia in esecuzione in 11.04. Ho un percorso funzionante per GtkStatusIcon ma dovrò sviluppare di nuovo tutto per indicatore-applet. Se ho capito il tuo commento al bug # 668375, posso eventualmente usare le mie icone locali senza dover creare un tema icona intero, posso?
Takkat,

Avendo avuto il tempo di immergermi nella programmazione di AppIndicator, ho scoperto che l'uso del suggerimento di jgoguen per verificare il modulo appindicator non aiuta davvero, perché le icone personalizzate non verranno visualizzate in 10.04 LTS. Vedi i miei commenti al bug # 668375.
Takkat,

La mia risposta include un modo molto semplice per risolvere questo problema. Ha funzionato molto bene per la mia app e ha persino reso indolore il porting di un'app che utilizza AppIndicator su Windows!
Nathan Osman,

10

Ho una soluzione eccellente che ha funzionato bene in StackApplet : ho creato una versione funzionalmente equivalente del appindicatormodulo che utilizza gtk.StatusIconinternamente per fornire funzionalità identiche quando il modulo reale non esiste.

Usarlo è semplice come:

  1. Scarica il seguente file e chiamaloappindicator_replacement.py
  2. Aggiungendo quanto segue all'applicazione:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator

Questo è tutto! Ora l'applicazione funzionerà perfettamente con o senza supporto per AppIndicators. Funzionerà anche su Windows, supponendo che tu non abbia nessun altro codice specifico per la piattaforma.


Nota: il file è rilasciato con licenza MIT, quindi puoi usarlo praticamente per qualsiasi cosa.


9

Dovrai scrivere il codice per entrambi. Puoi rilevare la presenza di appindicator nel tuo codice Python usando qualcosa di simile a:

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

Da lì, usa have_appindicator per decidere se utilizzare il codice appindicator o il codice gtk_status_icon.

Sfortunatamente, questo significa anche che dovrai avere sia Ubuntu che un altro ambiente con cui provare.


1
Tuttavia, potrebbero esserci ambienti in cui è installato python-appindicator ma l' applet indicatore non è in esecuzione. L'applicazione dovrebbe gestire anche questo.
Takkat,

In tal caso, consultare wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators > Fallback personalizzati. Per impostazione predefinita, otterrai un gtk.StatusIcon per l'indicatore dell'applicazione se non è presente un'applet indicatore.
htorque,

Sono a conoscenza dell'opzione di fallback. Quello che non capisco è se l'indicatore-applet non è in esecuzione come può l'indicatore-applet fornire un fallback?
Takkat,

Immagino che controlli semplicemente l'indicatore-applet e fornisca la funzionalità gtk_status_icon dietro le quinte.
Jgoguen,

1
@jgoguen: che cos'è "it"? Capisco che da 11.04 Ubuntu / Unity non supporterà più gtk_status_icon. Altre distribuzioni potrebbero non averlo "it". Sono davvero preoccupato per questo.
Takkat,

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 )

In questo modo è possibile rilevare se l'applet indicatore è in esecuzione. Non devi preoccuparti di Ubuntu 11.04 perché non sarà così. Non esiste uno scenario di fallback perché indicatore-applet è un componente obbligatorio, eseguito per impostazione predefinita.


Grazie per il tuo puntamento a ottenere il PID di indicatore-applet (lo faccio già per altre possibili dipendenze usando pidof), questo sarebbe certamente un modo meno elegante se non fosse disponibile nulla di meglio. Per quanto posso vedere, l'indicatore-applet funziona in modo affidabile con l'unità solo se i requisiti hardware sono soddisfatti. Gli utenti saranno in grado di avviare GNOME 2D e potrebbero decidere di non eseguire indicatore-applet. Tuttavia, ciò potrebbe non essere dovuto al mio problema.
Takkat,

Sono d'accordo con te sul fatto che potrebbe non essere "elegante" (ma puoi aggiungere tutto il cosmetico che desideri: D) tuttavia dovrebbe funzionare. Personalmente preferisco soluzioni che funzionano bene e l'eleganza è seconda :)
OpenNingia,

Questa attività non sembra essere in esecuzione sul mio sistema 14.04. L'approccio è stato superato? Vi sono /usr/lib/x86_64-linux-gnu/indicator-messages/indicator-messages-serviceinvece molte attività.
Halfer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.