Використання Gtk.Widgets в Індикаторах додатків із Python


44

У 2010 році Стефано Палаццо задав відповідне запитання: Помістити довільний gtk.Widget в appindicator.Indicator та подібний запитували на StackOverflow . В обох випадках консенсус полягає в тому, що показники програм Ubuntu обмежені. Як заявив Майкл Екстранд:

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

Однак це суперечить тому, що ми бачимо в індикаторі Bluetooth сьогодні, у 2016 році: він використовує тумблери.

введіть тут опис зображення

Те саме можна спостерігати з показником Ubuntu One з 13.04:

введіть тут опис зображення

Тож очевидно, що є спосіб. Я вивчив вихідний код індикатора-Bluetooth, але він написаний у Валі. Я, однак, працюю в першу чергу в пітоні, і навчитися Валі просто переписати всі мої вже існуючі показники - це занадто багато роботи.

Отже, суть питання: як можна використовувати Gtk.Widgets або, як мінімум, перемикач, як у індикаторі Bluetooth, використовуючи Python?

ПРИМІТКА : Я готовий поставити щедро за це питання, щоб нагородити відповіддю, який надасть робочий приклад в python . Інші мови не приймаються.


6
Індикатор програми обмежений, навіть не підтримує піктограму на льоту (він просто завантажує файл зображення з файлової системи). Ці показники, про які ви згадали, - це індикатори СИСТЕМИ (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 так, додаючи будь-який єдиний menuitem працює, він також працює, щоб додати Gtk.Box і додати Gtk.Label до цього вікна, але нічого іншого (він говорить, що віджет може містити лише один елемент.
Сергій Колодяжний

1
Gtk.ImageMenuItemзастаріло і не рекомендується використовувати btw: developer.gnome.org/gtkmm/stable/deprecated.html
Яків Влійм

Відповіді:


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для розбору.

Ця вправа є досить поганою, оскільки це все власні налаштування Unity компанії Canonical. Тож як тільки єдність піде, жодного прикладника немає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.