
將任何 gtk.Widget 放入 gtk.Menu 中可以透過先放入一個空的 gtk.MenuItem 來實現。它看起來並不可靠——但基本上它有效。使用 appindicator.Indicator ,它不起作用。該條目只是保持空白。例如,即使您將 child[border_size] 設定為 32。
唯一有效的小部件是 gtk.Label(當然還有 MenuItem、ImageMenuItem 等)。
現在我的選單中有一個 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,至少會顯示Entry。
這是一些工作代碼:
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()
答案1
應用程式指示器選單支援基於 D-Bus 選單,其支援的內容受到限制 - 它們僅支援基本選單功能,而不支援更奇特的東西,例如任何小工具。
他們支援此類事情的一個重要障礙是應用程式指示器選單是由不同的進程(應用程式指示器進程)呈現的,因此您的程式無法直接在其上繪製任何內容。克服這個問題需要在 D-Bus 選單中支援 X-Embed 之類的東西,或者允許所有 GTK 在 D-Bus 上工作。
答案2
Ubuntu 中的聲音指示器有音量滑塊,我想知道這是怎麼可能的。查看程式碼後,似乎有 GtkMenus 可以同時透過 dbus 填充: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html
但我不知道如何使用它們。想編寫一個聲音指示器,我可以控制每個應用程式的音量,就像 pavucontrol 可以做到的那樣。