Umieszczanie dowolnego gtk.Widget wewnątrz gtk.Menu działa nieco przez umieszczenie najpierw pustego gtk.MenuItem. Nie wydaje się być wiarygodny - ale w zasadzie działa. Z appindicator.Indicator nie działa. Wpis pozostaje pusty. Nawet jeśli na przykład ustawisz wartość child [border_size] na 32.
Jedynym działającym widżetem jest gtk.Label (plus MenuItem, ImageMenuItem itd.).
Teraz menu Me ma gtk. Wpisz, więc na pewno trzeba to zrobić poprawnie. Jak mam to zrobić?
Oto przykładowy kod wyjaśniający, o czym mówię:
self.item = gtk.MenuItem()
self.item.add(gtk.Label("hello world!"))
self.menu.append(self.item)
Powyższy kod działa, ale to nie działa:
self.item = gtk.MenuItem()
self.item.add(gtk.Entry())
self.menu.append(self.item)
Gdzie self.menu jest aplikatorem. Wskaźnik, gdyby był gtk.Menu, Wpis byłby przynajmniej wyświetlany.
Oto działający kod:
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()
Odpowiedzi:
Obsługa menu wskaźnika aplikacji opiera się na menu D-Bus, które są ograniczone w tym, co obsługują - obsługują tylko podstawowe funkcje menu, a nie bardziej egzotyczne rzeczy, takie jak arbitralne widżety.
Jedną ze znaczących przeszkód dla nich, które kiedykolwiek wspierają takie rzeczy, jest fakt, że menu wskaźnika aplikacji jest renderowane przez inny proces, proces wskaźnika aplikacji, więc twój program nie ma dostępu do bezpośredniego rysowania na nim niczego. Przezwyciężenie tego wymagałoby albo wsparcia czegoś takiego jak X-Embed w menu D-Bus lub umożliwienia wszystkim GTK pracy z D-Bus.
źródło
Wskaźnik dźwięku w Ubuntu ma suwaki głośności i zastanawiałem się, jak to możliwe. Po przejrzeniu kodu wydaje się, że istnieje GtkMenus, który tymczasem można wypełnić za pomocą dbus: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html
Ale nie wiem jak ich używać. Chciałem napisać wskaźnik dźwiękowy, w którym mogę kontrolować głośność aplikacji, tak jak pavucontrol może to zrobić.
źródło