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


23

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

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

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

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

如果指标小程序未运行,则gtk_status_icon的应用程序指标回退机制将不起作用。如果没有要导入的appindicator模块,Python解释器将不会运行。我是否需要针对不同的发行版开发不同的版本,还是有更好的方法来解决此问题?

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

Answers:


16

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

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

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


感谢您的明确回答。这指向了我要让我的应用程序在11.04中运行时必须走的路。我确实有GtkStatusIcon的工作路径,但将需要为指标小程序重新开发整个过程。如果我理解您对Bug#668375的评论,则可以不必创建整个图标主题就可以使用本地图标,可以吗?
塔卡特2010年

有时间去研究AppIndicator编程后,我发现使用jgoguen的建议来检查appindicator模块并没有真正的帮助,因为自定义图标不会在10.04 LTS中呈现。请参阅我对bug的评论#668375。
塔卡特2010年

我的答案包括解决这个问题的一种非常简单的方法。它对我的应用程序非常有效,甚至可以轻松地将使用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

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

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

从那里开始,使用have_appindicator决定您应该使用appindicator代码还是gtk_status_icon代码。

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


1
尽管如此,在某些环境中仍可能安装了python-appindicator指示器小程序未运行。应用程序也需要处理此问题。
塔卡特

对于这种情况,请参见wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators >自定义后备广告。默认情况下,如果不存在指示符小程序,您将为应用程序指示符获取gtk.StatusIcon。
htorque 2010年

我知道后备选项。我不明白的是,如果指标小程序没有运行,那么指标小程序如何提供后备呢?
塔卡特2010年

我想象它只是检查指标小程序并在幕后提供gtk_status_icon功能。
jgoguen

1
@jgoguen:什么是“它”?我了解从11.04开始,Ubuntu / Unity将不再支持gtk_status_icon。其他发行版可能没有“ it”。我真的很担心
塔卡特

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,因为事实并非如此。没有后备方案,因为indicator-applet是必选组件,默认情况下运行。


感谢您指出要获取指标小程序的PID(我已经通过使用pidof对其他可能的依赖关系进行了此操作),如果没有更好的方法,那将是公认的不太优雅的方法。据我所知,只有满足硬件要求,指标小程序才能可靠地统一运行。用户将能够启动到2D GNOME中,并可以决定不运行指标小程序。但是,这可能不是我的问题。
塔卡特

我同意您的看法,即它可能不会“优雅”(但您可以添加所有想要的化妆品:D),但它应该可以工作。我个人更喜欢效果很好的解决方案,而优雅是第二位:)
OpenNingia 2010年

此任务似乎未在我的14.04系统上运行。该方法是否已被取代?/usr/lib/x86_64-linux-gnu/indicator-messages/indicator-messages-service相反,有很多任务。
Halfer 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.