
Poner cualquier gtk.Widget dentro de un gtk.Menu funciona, en cierta medida, colocando primero un gtk.MenuItem vacío. No parece fiable, pero básicamente funciona. Con un indicador de aplicación. Indicador, no funciona. La entrada simplemente permanece vacía. Incluso si configuras child[border_size] en 32, por ejemplo.
El único widget que funciona es gtk.Label (más MenuItem, ImageMenuItem, etc., por supuesto).
Ahora el menú Yo tiene una entrada gtk.Entry, por lo que seguramente debe ser posible hacer esto 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, pero esto no:
self.item = gtk.MenuItem()
self.item.add(gtk.Entry())
self.menu.append(self.item)
Donde self.menu es un indicador de aplicación.Indicador, si fuera un menú gtk, al menos se mostraría 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()
Respuesta1
La compatibilidad con el menú del indicador de aplicaciones se basa en los menús D-Bus, que están limitados en lo que admiten: solo admiten funciones de menú básicas, no elementos más exóticos como widgets arbitrarios.
Un obstáculo importante para que alguna vez admitan tales cosas es el hecho de que el menú 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 nada directamente 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.
Respuesta2
El indicador de sonido en Ubuntu tiene controles deslizantes para el volumen y me preguntaba cómo es posible. Después de mirar el código, parece que hay GtkMenus que se pueden completar 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 tal como puede hacerlo pavucontrol.