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

Рассматриваемое приложение выполняет некоторое действие (здесь подключает аудио к сетевым потокам) и запускается в свернутом виде, если эти действия были успешными. Поэтому значок состояния необходим для отображения состояния соединения (например, СОЕДИНЕНО / ОТКЛЮЧЕНО). Только при нажатии на значок откроется окно приложения, чтобы получить доступ к дополнительным параметрам.

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

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

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

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

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

4 ответа

Решение

Я думаю, что здесь нужно больше определять библиотеку 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

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

Другие вопросы по тегам