问题描述
有问题的应用程序会执行某些操作(此处将音频连接到网络流),并且如果这些操作成功,则运行最小化。因此,需要一个状态图标来显示连接状态(例如CONNECTED /DISCONNECTED)。仅当单击该图标时,应用程序窗口才会打开以提供对其他选项的访问。
使用Python 2.6和pyGtk,我通过使用gtk_status_icon方便地实现了这一点。我特意编写了该应用程序,使其能够在尽可能多的发行版(包括各种Ubuntu版本)上运行。只有在用户安装了依赖项后,我才小心使用它们。
但是,现在我听说将来的Ubuntu版本将不再支持gtk_status_icon。要求开发人员改用应用程序指示器。那么什么是最佳实践来确保:
-
应用程序的本Map标显示正确
-
该应用程序仍将运行,并在以后的Ubuntu版本中显示其图标。
-
该应用程序还将在未提供indicator-applet,libappindicator和python-appindicator的其他环境中运行并显示其图标。
如果indicator-applet未运行,则对gtk_status_icon的应用程序指示器回退机制将不起作用。如果没有要导入的appindicator模块,Python解释器将不会运行。我是否需要针对不同的发行版开发不同的版本,还是有更好的方法来解决此问题?
除了Ubuntu Wiki中给出的示例外,在哪里可以找到有关如何使用ApplicationIndicator的文档?提供了哪些命令来检查indicator-applet是否正在运行,从而避免为Ubuntu发行版和非Ubuntu发行版编程不同的源代码?
最佳思路
我认为实际上需要更多确定python-appindicator库。如果存在,它将支持您需要的所有后备情况。它将适当地处理XFCE,KDE和较旧的GNOME。 Good example of how to do it in this answer。
Appindicator库将使用DBus来检查应用程序指示器呈现过程是否可用。在Unity上,或者在indicator-applet正在运行的情况下,就是这种情况。如果可用,它将使用它,否则,将回退到使用具有相同菜单的GtkStatusIcon。
不幸的是,我认为如果要处理库不可用的情况,则必须保留两个代码路径。不过,我们很乐意帮助您在其他发行版中获得该库:)
次佳思路
我有一个出色的解决方案,在StackApplet中运行良好-我创建了appindicator
模块的functionally-equivalent版本,该模块内部使用gtk.StatusIcon
来提供真实模块不存在时的相同功能。
使用它很简单:
-
下载following file并将其命名为
appindicator_replacement.py
-
将以下内容添加到您的应用程序:
try: import appindicator except ImportError: import appindicator_replacement as appindicator
而已!现在,无论是否支持AppIndicators,您的应用程序都能完美运行。假设您没有其他platform-specific代码,它甚至可以在Windows上运行。
注意:该文件是根据MIT许可发布的-因此您几乎可以将其用于任何用途。
第三种思路
您将需要为两者编写代码。您可以使用类似于以下内容的方法检测Python代码中是否存在appindicator:
have_appindicator = True
try:
import appindicator
except:
have_appindicator = False
从那里,使用have_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,因为事实并非如此。没有后备方案,因为indicator-applet是必选组件,默认情况下运行。