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

18

Помещение любого gtk.Widget внутри gtk.Menu работает, в некоторой степени, сначала помещая пустой gtk.MenuItem. Он не кажется надежным, но он в основном работает. С appindicator.Indicator это не работает. Запись просто остается пустой. Даже если вы задали дочерний [border_size] 32, например.

Единственный виджет, который работает, - gtk.Label (плюс MenuItem, ImageMenuItem и так далее, конечно).

Теперь в меню 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()
    
задан Stefano Palazzo 06.12.2010 в 14:25
источник

2 ответа

7

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

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

    
ответ дан Michael Ekstrand 06.12.2010 в 14:46
источник
2

Звуковой индикатор в Ubuntu имеет ползунки для тома, и я подумал, как это возможно. После просмотра кода, похоже, есть GtkMenus, который может быть заполнен через dbus тем временем: Ссылка

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

    
ответ дан c_korn 24.04.2016 в 00:15