Як запрограмувати піктограму стану, яка відображатиметься як в Ubuntu, так і в інших дистрибутивах?


23

Програма, про яку йде мова, виконує певні дії (тут підключення аудіо до мережевих потоків) і запускається до мінімуму, якщо ці дії були успішними. Тому потрібна піктограма статусу для відображення стану з'єднання (наприклад, ПІДКЛЮЧЕНО / ВІДКРИТИ). Лише при натисканні на піктограму відкриється вікно програми, щоб отримати доступ до подальших опцій.

Використовуючи Python 2.6 та pyGtk, я зручно зрозумів це за допомогою gtk_status_icon . Я навмисно написав програму для роботи на якомога більше дистрибутивах, включаючи різні версії Ubuntu. Я подбав про використання можливих залежностей лише після того, як користувач встановив їх.

Однак тепер я чую, що gtk_status_icon більше не підтримуватиметься у майбутніх випусках Ubuntu. Розробникам пропонується замість цього використовувати індикатори додатків. Тоді як найкраща практика, щоб переконатися, що:

  1. Місцеві значки програми відображаються належним чином
  2. Додаток все ще запускатиметься та відображатиме його значки у майбутніх випусках Ubuntu.
  3. Додаток також запускатиметься та відображатиме його піктограми в інших середовищах, де індикатор-аплет , libappindicator та python-appindicator не передбачені.

Механізми запасного показника програми для gtk_status_icon не працюватимуть, якщо індикатор-аплет не працює. Python перекладачі не будуть працювати , якщо не було appindicator модуля для імпорту. Чи потрібно мені розробляти різні версії для різних дистрибутивів чи є кращий спосіб обійти це.

Де я можу знайти документацію про використання ApplicationIndicator, крім прикладу, наведеного в Ubuntu Wiki ? Які команди надаються, щоб перевірити, чи працює індикатор-аплет, щоб уникнути програмування різних вихідних кодів для Ubuntu проти не-Ubuntu дистрибутивів?

Відповіді:


16

Я думаю, що потреба в цьому насправді є більш визначальним для бібліотеки python-appindicator. Якщо він присутній, він підтримуватиме всі резервні випадки, які вам потрібні. Він буде обробляти XFCE, KDE та старіший GNOME належним чином. Хороший приклад того, як це зробити у цій відповіді .

Бібліотека додатка використовуватиме DBus для перевірки, чи доступний процес надання індикаторів додатків. Це буде у випадку Unity, або якщо індикатор-аплет працює. Якщо він доступний, він використовуватиме це, якщо ні, він буде відновлювати використання GtkStatusIcon з тим же меню.

На жаль, я вважаю, що вам доведеться зберегти обидва шляхи коду, якщо ви хочете обробити випадки, коли бібліотека недоступна. Хоча ми будемо раді допомогти отримати бібліотеку в інших районах :)


Дякую за цю дуже чітку відповідь. Це вказує на шлях, який мені доведеться пройти, якщо я хочу, щоб моя програма працювала в 11.04. У мене є робочий шлях для GtkStatusIcon, але мені потрібно буде знову розробити все для індикатора-аплета. Якщо я зрозумів ваш коментар до помилки # 668375, я можу використовувати мої локальні значки, не створюючи цілу тему значків, чи можу я?
Таккат

Встигнувши зануритися в програмування AppIndicator, я виявив, що використання пропозиції jgoguen для перевірки модуля appindicator насправді не допомагає, оскільки власні іконки не відображатимуться в 10,04 LTS. Перегляньте мої коментарі до помилки # 668375.
Таккат

Моя відповідь включає дуже простий спосіб вирішити цю проблему. Це дуже добре працює для мого додатка і навіть безболісно переносить додаток, який використовує AppIndicators для Windows!
Натан Осман

10

У мене є чудове рішення, яке добре працювало в StackApplet - я створив функціонально еквівалентну версію appindicatorмодуля, який використовує gtk.StatusIconвнутрішню функцію для забезпечення однакової функціональності, коли реального модуля не існує.

Використовувати його так само просто, як:

  1. Завантажте наступний файл і зателефонуйте до ньогоappindicator_replacement.py
  2. Додавання наступного до вашої програми:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator

Це воно! Тепер ваша програма буде ідеально працювати з підтримкою AppIndicators або без неї. Він навіть працюватиме в Windows, якщо ви не маєте іншого коду, який залежить від платформи.


Примітка: файл випускається під ліцензією MIT - ви можете використовувати його майже для будь-чого.


9

Вам потрібно буде написати код для обох. Ви можете виявити присутність додатка у вашому коді Python, використовуючи щось подібне до:

have_appindicator = True
try:
    import appindicator
except:
    have_appindicator = False

Звідти використовуйте have_appindicator, щоб вирішити, чи слід використовувати код appindicator або код gtk_status_icon.

На жаль, це також означає, що вам потрібно мати як Ubuntu, так і інше середовище для тестування.


1
Однак можуть бути середовища, де встановлено python-appindicator , але аплет індикатора не працює. Додаток також повинен впоратися з цим.
Таккат

У цьому випадку див. Wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators > Спеціальні збори . За замовчуванням ви отримаєте gtk.StatusIcon для індикатора програми, якщо немає аплету індикатора.
htorque

Мені відомо про запасний варіант. Що я не розумію, якщо індикатор-аплет не працює, то як індикатор-аплет може забезпечити резервну віддачу?
Таккат

Я думаю, що він просто перевіряє індикатор-аплет і надає gtk_status_icon функціональність за кадром.
jgoguen

1
@jgoguen: що це "це"? Я розумію, що з 11.04 Ubuntu / Unity більше не підтримуватиме gtk_status_icon. Інші дистрибутиви можуть не мати "це". Я дуже переживаю з цього приводу.
Таккат

3
for line in os.popen("ps xa"): 
fields = line.split() 
pid = fields[0] 
process = fields[4]

applet_is_running = ( process.find('indicator-applet') > 0 )

Таким чином можна визначити, чи працює аплет індикатора. Вам не потрібно турбуватися про Ubuntu 11.04, оскільки це не буде так. Немає резервного сценарію, оскільки індикатор-аплет є обов'язковим компонентом, працює за замовчуванням.


Дякую за те, що ти вказуєш на отримання PID індикатора-аплету (я це вже роблю для інших можливих залежностей за допомогою pidof), це було б не менш елегантним способом, якби нічого кращого не було в наявності. Наскільки я бачу, індикатор-аплет надійно працює з єдністю лише в тому випадку, якщо дотримуються вимоги до обладнання. Користувачі зможуть завантажуватися в 2D GNOME і можуть вирішити не запускати індикатор-аплет. Однак це може не стати моєю проблемою.
Таккат

Я погоджуюся з вами, що це може бути не елегантно (але ви можете додати все необхідне для косметики: D), але це повинно працювати. Особисто я віддаю перевагу рішенням, які добре працюють, а витонченість приходить на друге місце :)
OpenNingia

Це завдання, схоже, не працює в моїй системі 14.04. Чи замінено підхід? /usr/lib/x86_64-linux-gnu/indicator-messages/indicator-messages-serviceНатомість багато завдань.
півзахисник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.