it-swarm.com.ru

Помещение произвольного gtk.Widget в appindicator.Indicator

Помещение любого 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()
18
Stefano Palazzo

Поддержка меню Application Indicator основана на меню D-Bus, которые ограничены в том, что они поддерживают - они поддерживают только базовые функции меню, а не более экзотические вещи, такие как произвольные виджеты.

Одним из существенных препятствий для тех, кто когда-либо поддерживал такие вещи, является тот факт, что меню индикаторов приложения отображается другим процессом, процессом индикатора приложения, поэтому ваша программа не имеет доступа, чтобы напрямую что-либо рисовать на нем. Преодоление этого потребовало бы либо поддержки чего-то вроде X-Embed в меню D-Bus, либо разрешения всем GTK работать через D-Bus.

7
Michael Ekstrand

У звукового индикатора в Ubuntu есть ползунки для регулировки громкости, и я подумал, как это возможно. После просмотра кода кажется, что GtkMenus можно заполнить через dbus: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html знак равно

Но я не знаю, как их использовать. Хотел написать звуковой индикатор, чтобы я мог контролировать громкость для каждого приложения, как это делает pavucontrol.

2
c_korn