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

44

В 2010 году Стефано Палаццо задал связанный с ним вопрос, Ввод произвольного файла gtk.Widget в appindicator.Indicator и аналогичный запрос был задан в StackOverflow . В обоих случаях консенсус в том, что индикаторы приложений Ubuntu ограничены. Как сказал Майкл Экстранд:

  

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

Однако, это противоречит тому, что мы видим в индикаторе Bluetooth сегодня, в 2016 году: он использует тумблеры.

То же самое можно наблюдать с индикатором Ubuntu One от 13.04:

Таким образом, очевидно, что есть способ. Я изучил исходный код индикатора bluetooth, но он написан в Вала. Однако я работаю в основном на python, и обучение Vala просто переписать все мои уже существующие индикаторы - это слишком много работы.

Итак, ядро ​​вопроса: Как можно использовать Gtk.Widgets или, как минимум, тумблер, как в индикаторе Bluetooth, используя Python?

ПРИМЕЧАНИЕ . Я готов пожертвовать этим вопросом, чтобы вознаградить ответ, который предоставит рабочий пример в python . Другие языки не принимаются.     

задан Sergiy Kolodyazhnyy 01.10.2016 в 02:55
источник

1 ответ

1

Эта проблема существует, потому что в то время как AppIndicators упрощают создание меню индикаторов, они мешают сделать это. Давайте посмотрим на различия между примером кода python с помощью AppIndicator и одним, использующим GLib-меню, как это делает код Bluetooth.

Во-первых, вам поручено сделать gtk.Menu , это старые объекты меню Gtk стиля, которые используют Gtk.Action , которые теперь устарели. AppIndicator принимает gtk.Menu объекта от вас во время процесса set_menu(...) и анализирует его, нажав каждое из меню, которое он находит, на службу индикатора, созданную с использованием libdbusmenu . Этот процесс разбора означает, что все, что не поддерживается AppIndicator, отфильтровано, независимо от того, что вы делаете.

Далее рассмотрим меню Bluetooth. Это создается с использованием объектов Gio.Menu , это новые меню стиля Gnome с использованием системы GAction . Затем он зарегистрировал свою собственную услугу, не используя AppIndicator или libdbusmenu , и настройте ее с использованием специального свойства x-canonical-type для создания виджета коммутатора, который передается в libido для синтаксического анализа.

Все это упражнение довольно плохое, так как это все собственные настройки Canonity Unity. Так что, как только единство идет, в любом случае нет аддиксаторов.

    
ответ дан Martin Owens -doctormo- 28.07.2017 в 20:36