Poner cualquier gtk.Widget dentro de un gtk.Menu funciona, de alguna manera, colocando un gtk.MenuItem vacío primero. No parece ser confiable, pero básicamente funciona. Con un appindicator.Indicator, no funciona. La entrada solo permanece vacía. Incluso si configura el elemento secundario [border_size] en 32, por ejemplo.
El único widget que funciona es un gtk.Label (más el MenuItem, ImageMenuItem, etc., por supuesto).
Ahora el menú Me tiene un gtk. Ingrese, por lo que seguramente debe ser posible hacerlo correctamente. ¿Cómo lo hago?
Aquí hay un código de ejemplo para explicar de qué estoy hablando:
self.item = gtk.MenuItem()
self.item.add(gtk.Label("hello world!"))
self.menu.append(self.item)
El código anterior funciona, sin embargo, esto no:
self.item = gtk.MenuItem()
self.item.add(gtk.Entry())
self.menu.append(self.item)
Donde self.menu es un appindicator.Indicator, si se tratara de un gtk.Menu, al menos se mostrará la entrada.
Aquí hay un código de trabajo:
import gtk
import appindicator
class AppIndicator (object):
def __init__(self):
self.ind = appindicator.Indicator("hello world client",
"distributor-logo", appindicator.CATEGORY_APPLICATION_STATUS)
self.ind.set_status (appindicator.STATUS_ACTIVE)
self.menu = gtk.Menu()
item = gtk.MenuItem()
item.add(gtk.Label("hello world"))
# item.add(gtk.Entry())
self.menu.append(item)
self.menu.show_all()
self.ind.set_menu(self.menu)
indicator = AppIndicator()
gtk.main()
Respuestas:
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.
Un obstáculo significativo para ellos que alguna vez apoyan tales cosas es el hecho de que el menú del indicador de la aplicación se representa mediante un proceso diferente, el proceso del indicador de la aplicación, por lo que su programa no tiene acceso para dibujar directamente nada en él. Superar esto requeriría admitir algo como X-Embed en los menús de D-Bus o permitir que todo GTK funcione sobre D-Bus.
fuente
El indicador de sonido en Ubuntu tiene controles deslizantes para el volumen y me preguntaba cómo es posible. Después de echar un vistazo al código, parece que hay GtkMenus que se puede llenar a través de dbus mientras tanto: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html
Pero no sé cómo usarlos. Quería escribir un indicador de sonido donde pueda controlar el volumen por aplicación al igual que pavucontrol puede hacerlo.
fuente