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

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

所讨论的应用程序执行一些操作(此处将音频连接到网络流),如果这些操作成功,则最小化运行。因此需要一个状态图标来显示连接的状态(例如已连接/已断开连接)。只有单击图标时,应用程序窗口才会打开,以便访问更多选项。

使用 Python 2.6 和 pyGtk,我方便地通过使用gtk_status_icon。我特意将应用程序编写为可以在尽可能多的发行版上运行,包括各种 Ubuntu 版本。我注意仅在用户安装了可能的依赖项后才使用它们。

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

  1. 应用程序的本地图标显示正确
  2. 该应用程序仍将在未来的 Ubuntu 版本中运行并显示其图标。
  3. 该应用程序将在其他环境中运行并显示其图标指示器小程序libappindicator, 和python-appindicator未提供。

如果发生以下情况,应用程序指示器回退机制将无法运行到 gtk_status_icon:指示器小程序没有运行。如果没有应用指标模块导入。我是否需要为不同的发行版开发不同的版本,或者是否有更好的方法来解决此问题。

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

答案1

我认为这里的需求实际上更多地取决于 python-appindicator 库是否存在。如果存在,它将支持您需要的所有后备情况。它将适当地处理 XFCE、KDE ​​和较旧的 GNOME。 这个答案很好地说明了如何做到这一点

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

不幸的是,我认为如果您想处理库不可用的情况,您必须保留这两个代码路径。不过,我们很乐意帮助在其他发行版中获取该库 :)

答案2

我有一个非常好的解决方案,堆栈小程序- 我创建了一个功能等效的模块版本,当真实模块不存在时,appindicator该模块在内部使用以提供相同的功能。gtk.StatusIcon

使用方法非常简单:

  1. 下载关注文件并称之为appindicator_replacement.py
  2. 将以下内容添加到您的应用程序:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator
    

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


笔记:该文件是根据 MIT 许可证发布的 - 因此您几乎可以将它用于任何事情。

答案3

您需要为两者编写代码。您可以使用类似以下代码在 Python 代码中检测 appindicator 的存在:

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

从那里,使用 have_appindicator 来决定是否应该使用 appindicator 代码或 gtk_status_icon 代码。

不幸的是,这也意味着您需要同时拥有 Ubuntu 和另一个环境来进行测试。

答案4

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,因为情况并非如此。没有后备方案,因为指示器小程序是必需组件,默认情况下运行。

相关内容