¿Cómo programar un ícono de estado que se mostrará en Ubuntu, así como en otras distribuciones?

23

La aplicación en cuestión realiza alguna acción (aquí conecta el audio a las transmisiones de red) y se ejecuta minimizada si estas acciones fueron exitosas. Por lo tanto, se necesita un icono de estado para mostrar el estado de la conexión (por ejemplo, CONECTADO / DESCONECTADO). Solo al hacer clic en el icono se abrirá la ventana de la aplicación para dar acceso a otras opciones.

Usando Python 2.6 y pyGtk, me di cuenta convenientemente de esto usando gtk_status_icon . Deliberadamente escribí la aplicación para que se ejecute en tantas distribuciones como sea posible, incluidas las diversas versiones de Ubuntu. Me ocupé de usar posibles dependencias solo después de que el usuario las instaló.

Sin embargo, ahora escucho que gtk_status_icon ya no será compatible en futuras versiones de Ubuntu. Se les pide a los desarrolladores que usen indicadores de aplicación en su lugar. ¿Cuál es entonces la mejor práctica para asegurarse de que:

  1. Los iconos locales de la aplicación se muestran correctamente
  2. La aplicación aún se ejecutará y mostrará sus íconos en futuras versiones de Ubuntu.
  3. La aplicación también se ejecutará y mostrará sus íconos en otros entornos donde no se proporcionan indicador-applet , libappindicator y python-appindicator .

Los mecanismos de respaldo del indicador de aplicación a gtk_status_icon no funcionarán si el applet indicador no se está ejecutando. Los intérpretes de Python no se ejecutarán si no hubiera un módulo de aplicación desde el cual importar. ¿Necesito desarrollar diferentes versiones para diferentes distribuciones o hay una mejor manera de solucionar esto?

¿Dónde encuentro una documentación sobre cómo usar ApplicationIndicator que no sea en el ejemplo dado en Ubuntu Wiki ? ¿Qué comandos se proporcionan para verificar si el applet indicador se está ejecutando para evitar la programación de diferentes códigos fuente para distribuciones de Ubuntu vs.

Takkat
fuente

Respuestas:

16

Creo que la necesidad aquí es en realidad más determinante de la biblioteca python-appindicator que está presente. Si está presente, admitirá todos los casos de reserva que necesite. Manejará XFCE, KDE y GNOME anterior de manera apropiada. Buen ejemplo de cómo hacerlo en esta respuesta .

La biblioteca del appindicator utilizará DBus para verificar si el proceso de representación del indicador de la aplicación está disponible. Este será el caso en Unity, o si el applet indicador se está ejecutando. Si está disponible, usará eso; de lo contrario, recurrirá al uso de un GtkStatusIcon con el mismo menú.

Desafortunadamente, creo que tendría que mantener ambas rutas de código si desea manejar el caso de que la biblioteca no esté disponible. Sin embargo, estaremos encantados de ayudar a obtener la biblioteca en otras distribuciones :)

Ted Gould
fuente
Gracias por esta respuesta muy clara. Esto señala el camino que tendré que seguir si quiero que mi aplicación se ejecute en 11.04. Tengo un camino de trabajo para GtkStatusIcon pero necesitaré desarrollar todo nuevamente para el applet indicador. Si entendí tu comentario sobre el error # 668375, posiblemente pueda usar mis íconos locales sin tener que crear un tema ícono completo, ¿puedo?
Takkat
Habiendo tenido tiempo de sumergirme en la programación de AppIndicator, descubrí que usar la sugerencia de jgoguen para verificar el módulo de appindicator realmente no ayuda, porque los iconos personalizados no se mostrarán en 10.04 LTS. Vea mis comentarios al bug # 668375.
Takkat
Mi respuesta incluye una manera muy fácil de resolver este problema. ¡Funcionó muy bien para mi aplicación e incluso ha hecho que sea fácil portar una aplicación que usa AppIndicators a Windows!
Nathan Osman
10

Tengo una solución excelente que ha funcionado bien en StackApplet : creé una versión funcionalmente equivalente del appindicatormódulo que se usa gtk.StatusIconinternamente para proporcionar una funcionalidad idéntica cuando el módulo real no existe.

Usarlo es tan simple como:

  1. Descargando el siguiente archivo y llámaloappindicator_replacement.py
  2. Agregar lo siguiente a su aplicación:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator

¡Eso es! Ahora su aplicación funcionará perfectamente con o sin soporte para AppIndicators. Incluso se ejecutará en Windows, suponiendo que no tenga ningún otro código específico de la plataforma.


Nota: el archivo se publica bajo la licencia MIT, por lo que puede usarlo prácticamente para cualquier cosa.

Nathan Osman
fuente
9

Necesitará escribir código para ambos. Puede detectar la presencia de appindicator en su código Python usando algo similar a:

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

A partir de ahí, use have_appindicator para decidir si debe usar el código appindicator o el código gtk_status_icon.

Desafortunadamente, esto también significa que necesitará tener un entorno Ubuntu y otro para probar.

jgoguen
fuente
1
Aún así, puede haber entornos donde está instalado python-appindicator pero el applet indicador no se está ejecutando. La aplicación también debería manejar esto.
Takkat
Para ese caso, consulte wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators > Custom Fallbacks. Por defecto, obtendrá un gtk.StatusIcon para el indicador de la aplicación si no hay un applet indicador presente.
htorque
Soy consciente de la opción de reserva. Lo que no entiendo es, si el applet indicador no se está ejecutando, ¿cómo puede el applet indicador proporcionar un respaldo?
Takkat
Me imagino que simplemente comprueba el applet indicador y proporciona la funcionalidad gtk_status_icon detrás de escena.
jgoguen
1
@jgoguen: ¿qué es "eso"? Entiendo que a partir del 11.04 Ubuntu / Unity ya no admitirá gtk_status_icon. Otras distribuciones pueden no tener "eso". Estoy realmente preocupado por esto.
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 )

De esta manera puede detectar si el applet indicador se está ejecutando. No necesita preocuparse por Ubuntu 11.04 porque este no será el caso. No hay escenario de reserva porque el indicador-applet es un componente obligatorio, que se ejecuta de forma predeterminada.

OpenNingia
fuente
Gracias por apuntar a obtener el PID del indicador-applet (ya lo hago para otras posibles dependencias usando pidof), esta sería una forma menos elegante si no hubiera nada mejor disponible. Hasta donde puedo ver, el applet indicador se ejecuta de manera confiable con la unidad solo si se cumplen los requisitos de hardware. Los usuarios podrán iniciar en GNOME 2D y podrían decidir no ejecutar el applet indicador. Sin embargo, esto puede no ser por mi problema entonces.
Takkat
Estoy de acuerdo con usted en que puede no ser 'elegante' (pero puede agregar todos los cosméticos que desee: D), sin embargo, debería funcionar. Personalmente, prefiero las soluciones que funcionan bien y la elegancia
ocupa el
Esta tarea no parece estar ejecutándose en mi sistema 14.04. ¿Se ha reemplazado el enfoque? Hay muchas /usr/lib/x86_64-linux-gnu/indicator-messages/indicator-messages-servicetareas en su lugar.
halfer