Uso de Gtk.Widgets en indicadores de aplicaciones con Python

44

En 2010, Stefano Palazzo, hizo una pregunta relacionada: poner un widget arbitrario gtk en un appindicator.Indicator , y uno similar en StackOverflow . En ambos casos, el consenso es que los indicadores de aplicaciones de Ubuntu son limitados. Como dijo Michael Ekstrand:

El soporte del menú Indicador de aplicación se basa en los menús de D-Bus, que son limitados en lo que admiten: solo admiten la funcionalidad básica del menú, no cosas más exóticas como widgets arbitrarios.

Sin embargo, contradice lo que vemos en el indicador Bluetooth de hoy, en 2016: utiliza interruptores de palanca.

ingrese la descripción de la imagen aquí

Lo mismo podría observarse con el indicador Ubuntu One de 13.04:

ingrese la descripción de la imagen aquí

Entonces obviamente hay un camino. He estudiado el código fuente del indicador bluetooth, pero está escrito en Vala. Sin embargo, trabajo principalmente en Python, y aprender a Vala a reescribir todos mis indicadores ya existentes es demasiado trabajo.

Entonces, el núcleo de la pregunta: ¿cómo se puede usar Gtk.Widgets, o como mínimo un interruptor de palanca al igual que en el indicador Bluetooth, usando Python?

NOTA : Estoy dispuesto a recompensar esta pregunta para recompensar una respuesta que proporcionará un ejemplo de trabajo en python . No se aceptan otros idiomas.

Sergiy Kolodyazhnyy
fuente
66
El indicador de la aplicación es limitado, incluso no admite el icono sobre la marcha (solo carga el archivo de imagen del sistema de archivos). Esos indicadores que ha mencionado son indicadores del SISTEMA (bluetooth, ubuntu one, sonido, potencia, ...). Son diferentes y no están usando libappindicator. Ya he publicado algunas publicaciones que pueden ayudar a aclarar la diferencia. Ya tengo un indicador del sistema trabajando con C. pero en Python todavía estoy luchando.
user.dz
2
¿Hay alguna manera de atraer la atención de los desarrolladores principales de Ubuntu a esta pregunta?
don.joey
1
Al menos test = Gtk.CheckMenuItem("Monkey")funciona agregando un botón de verificación, pero debería haber más. Mientras que se trabaje, éste debería funcionar, pero sin que: Gtk.CheckMenuItemToggled("Monkey"). Estoy bastante seguro de que puede funcionar de todos modos. Ver: developer.gnome.org/gtk3/stable/GtkCheckMenuItem.html
Jacob Vlijm
1
@JacobVlijm sí, agregar cualquier elemento de menú único funciona, también funciona agregar un Gtk.Box y agregar Gtk.Label a ese cuadro, pero nada más (dice que el widget puede contener solo un elemento.
Sergiy Kolodyazhnyy
1
Gtk.ImageMenuItemestá desaprobado y desaconsejado usar btw: developer.gnome.org/gtkmm/stable/deprecated.html
Jacob Vlijm

Respuestas:

1

Este problema existe porque, si bien los AppIndicators facilitan la creación de un menú de indicadores, se interponen en la elaboración de uno. Veamos las diferencias entre el código de python de ejemplo que usa AppIndicator y uno que usa los menús GLib de la misma manera que lo hace el código de Bluetooth.

En primer lugar, se le indica que haga un gtk.Menu, estos son objetos de menú Gtk de estilo antiguo que usan y Gtk.Actionque ahora están en desuso. AppIndicator le quita el gtk.Menuobjeto durante el set_menu(...)proceso y lo analiza, colocando cada uno de los menús que encuentra en el servicio de indicador creado usando libdbusmenu. Este proceso de análisis significa que todo lo que no sea compatible con AppIndicator se filtra, sin importar lo que haga.

A continuación, veamos el menú de Bluetooth. Eso se crea usando Gio.Menuobjetos, estos son nuevos menús de estilo Gnome que usan el GActionsistema. Luego registró su propio servicio sin usar AppIndicatoro libdbusmenuy lo configuró usando una x-canonical-typepropiedad personalizada para crear el widget de conmutador que se pasa al libidoanálisis.

Todo este ejercicio es bastante malo, ya que son todas las personalizaciones de Unity de Canonical. Entonces, tan pronto como la unidad se va, no hay appindicadores de todos modos.

Martin Owens -doctormo-
fuente