Как запрограммировать значок состояния, который будет отображаться в Ubuntu, а также в других дистрибутивах?

В рассматриваемом приложении некоторые действия (при подключении аудио к сетевым потокам) и выполняются с минимальными, если эти действия были успешными. Поэтому для отображения состояния соединения требуется значок состояния (например, CONNECTED / DISCONNECTED). Только при нажатии значка откроется окно приложения, чтобы предоставить доступ к дополнительным параметрам.

Используя Python 2.6 и pyGtk, я понял это с помощью gtk_status_icon . Я намеренно написал приложение для запуска как можно большего количества дистрибутивов, включая различные версии Ubuntu. Я позаботился о том, чтобы использовать возможные зависимости только после того, как пользователь их установил.

Однако теперь я слышу, что gtk_status_icon больше не будет поддерживаться в будущих выпусках Ubuntu. Разработчикам предлагается использовать Application Indicators. Тогда лучше всего убедиться, что:

  1. Локальные значки приложения отображаются правильно
  2. Приложение все равно будет запускаться и отображать его значки в будущих выпусках Ubuntu.
  3. Приложение также будет запускать и отображать его значки в других средах, где не предусмотрены индикатор-апплет , libappindicator и python-appindicator .

Резервные механизмы индикатора приложения для gtk_status_icon не будут работать, если индикатор-апплет не запущен. Утилиты Python не будут работать, если для импорта не требуется модуль appindicator . Нужно ли мне разрабатывать разные версии для разных дистрибутивов или есть лучший способ обойти это.

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

Я думаю, что необходимость здесь в том, чтобы на самом деле больше определить библиотеку python-appindicator. Если он присутствует, он будет поддерживать все резервные случаи, которые вам нужны. Он будет обрабатывать XFCE, KDE и более старый GNOME соответствующим образом. Хороший пример того, как это сделать в этом ответе .

Библиотека appindicator будет использовать DBus, чтобы проверить, доступен ли процесс рендеринга индикатора приложения. Это будет иметь место в Unity, или если индикатор-апплет запущен. Если он будет доступен, он будет использовать это, если нет, то он откажется от использования GtkStatusIcon с тем же меню.

К сожалению, я считаю, что вам нужно будет сохранить оба пути кода, если вы хотите обработать случай, когда библиотека недоступна. Хотя, мы будем рады помочь получить библиотеку в других дистрибутивах 🙂

У меня отличное решение, хорошо работающее в StackApplet – я создал функционально эквивалентную версию модуля appindicator который использует gtk.StatusIcon для обеспечения идентичной функциональности, когда реального модуля не существует.

Использование его так же просто, как:

  1. Загрузите следующий файл и назовите его appindicator_replacement.py
  2. Добавьте в приложение следующее:

     try: import appindicator except ImportError: import appindicator_replacement as appindicator 

Это оно! Теперь ваше приложение будет работать отлично или без поддержки AppIndicators. Он будет работать даже в Windows, если у вас нет другого кода для конкретной платформы.


Примечание: файл выпущен под лицензией MIT, поэтому вы можете использовать его практически для чего угодно.

Вам нужно будет написать код для обоих. Вы можете обнаружить наличие appindicator в вашем коде Python, используя что-то похожее на:

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

Оттуда используйте has_appindicator, чтобы решить, следует ли использовать код appindicator или код gtk_status_icon.

К сожалению, это также означает, что вам нужно будет иметь как Ubuntu, так и другую среду для тестирования.

 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, потому что это не так. Нет никакого сценария возврата, поскольку индикатор-апплет является обязательным компонентом, который работает по умолчанию.