当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

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

使用Python 2.6和pyGtk,我通过使用gtk_status_icon方便地实现了这一点。我特意编写了该应用程序,使其能够在尽可能多的发行版(包括各种Ubuntu版本)上运行。只有在用户安装了依赖项后,我才小心使用它们。

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

  1. 应用程序的本Map标显示正确

  2. 该应用程序仍将运行,并在以后的Ubuntu版本中显示其图标。

  3. 该应用程序还将在未提供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来提供真实模块不存在时的相同功能。

使用它很简单:

  1. 下载following file并将其命名为appindicator_replacement.py

  2. 将以下内容添加到您的应用程序:

    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是必选组件,默认情况下运行。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11664.html,未经允许,请勿转载。