В 2010 году Стефано Палаццо задал связанный вопрос: «Поместить произвольный gtk.Widget в appindicator.Indicator , и аналогичный вопрос был задан в StackOverflow» . В обоих случаях все согласны с тем, что показатели приложений в Ubuntu ограничены. Как сказал Майкл Экстранд:
Поддержка меню Application Indicator основана на меню D-Bus, которые ограничены в том, что они поддерживают - они поддерживают только базовые функции меню, а не более экзотические вещи, такие как произвольные виджеты.
Однако это противоречит тому, что мы видим в индикаторе Bluetooth сегодня, в 2016 году: он использует тумблеры.
То же самое можно наблюдать с индикатором Ubuntu One от 13.04:
Так что, очевидно, есть способ. Я изучил исходный код индикатора bluetooth, но он написан на Vala. Я, однако, работаю в основном на python, и изучение Vala только для того, чтобы переписать все мои уже существующие индикаторы, - это слишком много работы.
Итак, суть вопроса: как с помощью Python можно использовать Gtk.Widgets или, как минимум, тумблер, как в индикаторе Bluetooth, с помощью Python?
ПРИМЕЧАНИЕ : я готов назначить награду за этот вопрос, чтобы вознаградить за ответ, который послужит рабочим примером на python . Другие языки не принимаются.
источник
test = Gtk.CheckMenuItem("Monkey")
работает добавление кнопки, но должно быть больше. Несмотря на то , что один работает, это один должен работать, но это не так :Gtk.CheckMenuItemToggled("Monkey")
. Я почти уверен, что это может сработать. См .: developer.gnome.org/gtk3/stable/GtkCheckMenuItem.htmlGtk.ImageMenuItem
не рекомендуется и не рекомендуется использовать btw: developer.gnome.org/gtkmm/stable/deprecated.htmlОтветы:
Эта проблема существует, потому что, хотя AppIndicators облегчают создание меню индикатора, они мешают его создать. Давайте посмотрим на различия между примером кода Python, использующего AppIndicator, и кодом GLib Menus, как это делает код Bluetooth.
Во-первых, вы
gtk.Menu
получили указание сделать , это объекты меню Gtk старого стиляGtk.Action
, которые теперь не поддерживаются. AppIndicator забираетgtk.Menu
объект у вас во времяset_menu(...)
процесса и анализирует его, помещая каждое из найденных меню в службу индикатора, созданную с помощьюlibdbusmenu
. Этот процесс анализа означает, что все, что не поддерживается AppIndicator, отфильтровывается, независимо от того, что вы делаете.Далее давайте посмотрим на меню Bluetooth. Это создано с использованием
Gio.Menu
объектов, это новое меню стиля Gnome с использованиемGAction
системы. Затем он зарегистрировал свой собственный сервис без использованияAppIndicator
илиlibdbusmenu
и установил его, используя пользовательскоеx-canonical-type
свойство для создания виджета переключателя, который передаетсяlibido
для анализа.Все это упражнение довольно плохое, поскольку все это собственные настройки Unity от Canonical. Так что, как только единство уйдет, аппендикаторы все равно не появятся.
источник