如何编写将在Ubuntu以及其他发行版中显示的状态图标?

有问题的应用程序执行某些操作(此处将音频连接到网络流),并在这些操作成功时最小化运行。 因此,需要状态图标来显示连接状态(例如,CONNECTED / DISCONNECTED)。 只有在单击图标时,才会打开应用程序窗口以访问其他选项。

使用Python 2.6和pyGtk我通过使用gtk_status_icon方便地实现了这一点。 我故意编写应用程序以在尽可能多的发行版上运行,包括各种Ubuntu版本。 我只是在用户安装后才使用可能的依赖项。

但是现在我听说在将来的Ubuntu版本中将不再支持gtk_status_icon。 要求开发人员使用应用程序指示器。 那么最佳做法是确保:

  1. 应用程序的本地图标正确显示
  2. 该应用程序仍将在未来的Ubuntu版本中运行并显示它的图标。
  3. 该应用程序还将在其他未提供indicator-appletlibappindicatorpython-appindicator的环境中运行并显示它的图标。

如果指标 -applet未运行,则gtk_status_icon的应用程序指示符回退机制将不起作用。 如果没有要从中导入的appindicator模块,Python解释器将无法运行。 我是否需要为不同的发行版开发不同的版本,或者有更好的方法来解决这个问题。

除了在Ubuntu Wiki中给出的示例之外,我在哪里可以找到有关如何使用ApplicationIndicator的文档? 提供了哪些命令来检查指标applet是否正在运行,以避免为Ubuntu与非Ubuntu发行版编写不同的源代码?

我认为这里的需要实际上更多地确定了python-appindicator库的存在。 如果它存在,它将支持您需要的所有后备案例。 它将适当地处理XFCE,KDE和旧版GNOME。 在这个答案中如何做到这一点的好例子 。

appindicator库将使用DBus检查应用程序指示器呈现过程是否可用。 这将是Unity的情况,或者指示器小程序正在运行。 如果它可用,它将使用它,如果没有,它将回退到使用具有相同菜单的GtkStatusIcon。

不幸的是,如果你想处理库不可用的情况,我相信你必须保留两个代码路径。 虽然,我们很乐意帮助在其他发行版中获取图书馆:)

我有一个很好的解决方案,在StackApplet中运行良好 – 我创建了一个function等效的appindicator模块版本,它在内部使用gtk.StatusIcon ,在真实模块不存在时提供相同的function。

使用它很简单:

  1. 下载以下文件并将其appindicator_replacement.py
  2. 在应用程序中添加以下内容:

     try: import appindicator except ImportError: import appindicator_replacement as appindicator 

而已! 现在,无论是否支持AppIndicators,您的应用程序都将完美运行。 它甚至可以在Windows上运行,假设您没有任何其他特定于平台的代码。


注意:该文件是在MIT许可下发布的 – 因此您几乎可以使用它。

您需要为两者编写代码。 您可以使用类似于以下内容的方法检测Python代码中是否存在appindicator:

 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 ) 

这样您就可以检测指标applet是否正在运行。 您不必担心Ubuntu 11.04,因为情况并非如此。 没有后备方案,因为指标小程序是必需组件,默认情况下运行。