Использование Gtk.Widgets в индикаторах приложения с Python

44

В 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 . Другие языки не принимаются.

Сергей Колодяжный
источник
6
Индикатор приложения ограничен, даже не поддерживает значок на лету (он просто загружает файл изображения из файловой системы). Эти индикаторы, которые вы упомянули, являются индикаторами SYSTEM (Bluetooth, Ubuntu One, Звук, Мощность, ...). Они разные и не используют libappindicator. Я уже опубликовал несколько сообщений, которые могут помочь прояснить разницу. У меня уже есть системный индикатор, работающий с использованием C., но в python я все еще борюсь.
user.dz
2
Есть ли способ привлечь внимание разработчиков ядра Ubuntu к этому вопросу?
don.joey
1
По крайней мере, test = Gtk.CheckMenuItem("Monkey")работает добавление кнопки, но должно быть больше. Несмотря на то , что один работает, это один должен работать, но это не так : Gtk.CheckMenuItemToggled("Monkey"). Я почти уверен, что это может сработать. См .: developer.gnome.org/gtk3/stable/GtkCheckMenuItem.html
Джейкоб Влейм,
1
@JacobVlijm да, добавление любого отдельного элемента меню работает, также можно добавить Gtk.Box и добавить Gtk.Label в это поле, но больше ничего (в нем говорится, что виджет может содержать только один элемент.
Сергей Колодяжный,
1
Gtk.ImageMenuItemне рекомендуется и не рекомендуется использовать btw: developer.gnome.org/gtkmm/stable/deprecated.html
Джейкоб Влим

Ответы:

1

Эта проблема существует, потому что, хотя 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. Так что, как только единство уйдет, аппендикаторы все равно не появятся.

Мартин Оуэнс -доктормо-
источник