Как запрограммировать значок состояния, который будет отображаться в 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?

Takkat
источник

Ответы:

16

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

Библиотека appindicator будет использовать 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

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

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

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

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

jgoguen
источник
1
Тем не менее, могут быть среды, в которых установлен python-appindicator, но апплет индикатора не запущен. Приложение также должно справиться с этим.
Таккат
Для этого см. Wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators > Пользовательские запасные варианты . По умолчанию вы получите gtk.StatusIcon для индикатора приложения, если апплета индикатора нет.
2010 г.
Я знаю об альтернативном варианте. Чего я не понимаю, так это если индикатор-апплет не работает, как индикатор-апплет может предоставить запасной вариант?
Таккат
Я предполагаю, что он просто проверяет индикатор-апплет и предоставляет функциональность 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, потому что это не так. Резервного сценария не существует, поскольку индикатор-апплет является обязательным компонентом, работающим по умолчанию.

OpenNingia
источник
Спасибо, что указали на получение PID индикатора-апплета (я делаю это уже для других возможных зависимостей, используя pidof), это было бы, по общему признанию, менее элегантным способом, если бы ничего лучшего не было доступно. Насколько я вижу, индикатор-апплет надежно работает с единицей, только если выполнены требования к оборудованию. Пользователи смогут загружаться в 2D GNOME и могут не запускать индикатор-апплет. Однако это может быть не моей проблемой тогда.
Таккат
Я согласен с вами, что это не может быть «элегантно» (но вы можете добавить все косметические средства, которые вы хотите: D), однако это должно работать. Лично я предпочитаю решения, которые хорошо работают, а элегантность стоит на втором месте :)
OpenNingia
Похоже, эта задача не выполняется в моей системе 14.04. Был ли этот подход отменен? /usr/lib/x86_64-linux-gnu/indicator-messages/indicator-messages-serviceВместо этого есть много задач.
Полузащитник