Помещение любого gtk.Widget в gtk.Menu работает, в некотором смысле, сначала помещая пустой gtk.MenuItem. Это не кажется надежным - но в основном это работает. С appindicator.Indicator это не работает. Запись просто остается пустой. Даже если вы установите для дочернего элемента [border_size] значение 32, например.
Единственный работающий виджет - это gtk.Label (плюс, конечно, MenuItem, ImageMenuItem и так далее).
Теперь в Me Me есть gtk.Entry, поэтому должно быть возможно сделать это правильно. Как это сделать?
Вот пример кода, чтобы объяснить, о чем я:
self.item = gtk.MenuItem()
self.item.add(gtk.Label("hello world!"))
self.menu.append(self.item)
Приведенный выше код работает, однако это не так:
self.item = gtk.MenuItem()
self.item.add(gtk.Entry())
self.menu.append(self.item)
Где self.menu является appindicator.Indicator, если бы это было gtk.Menu, запись будет отображаться по крайней мере.
Вот некоторый рабочий код:
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()
Ответы:
Поддержка меню Application Indicator основана на меню D-Bus, которые ограничены в том, что они поддерживают - они поддерживают только базовые функции меню, а не более экзотические вещи, такие как произвольные виджеты.
Одним из существенных препятствий для тех, кто когда-либо поддерживал такие вещи, является тот факт, что меню индикаторов приложения отображается другим процессом, процессом индикатора приложения, поэтому ваша программа не имеет доступа, чтобы напрямую что-либо рисовать на нем. Преодоление этого потребовало бы либо поддержки чего-то вроде X-Embed в меню D-Bus, либо разрешения всем GTK работать через D-Bus.
источник
У звукового индикатора в Ubuntu есть ползунки для регулировки громкости, и я подумал, как это возможно. После просмотра кода кажется, что GtkMenus можно заполнить через dbus: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html
Но я не знаю, как их использовать. Хотел написать звуковой индикатор, чтобы я мог контролировать громкость для каждого приложения, как это делает pavucontrol.
источник