用Python编写简单的Gnome面板小程序

15
当我坐火车上班时,我会将我的网书连接到我的Nexus One的wifi热点。在穿过隧道时,我的手机显然失去了3G连接,并需要一段时间才能在火车出现后重新建立连接。但是由于仍然连接到手机本身,网书的wifi图标保持不变。
我编写了一个小的Python程序,尝试ping服务器并因此决定是否有互联网连接(如果您有更快或使用流量更少的检测互联网连接方法,请随时提出建议,因为我每月有数据限制)。
我的问题是:如何创建一个GNOME Panel 2.30.2的Python小程序,以图形化方式显示这个状态,以便我可以决定何时继续点击链接并期望互联网正常工作。
我已经使用面板按钮获得了这个示例,但是希望有一个图标,根据情况进行更改。
我用Python编程已经有几年了,但之前没有编码过gnome。我使用的是10.04版的Ubuntu桌面版,而不是Unity。

我会看一下 IBus 是如何做的。 - Ignacio Vazquez-Abrams
2个回答

9

请查看我制作的这个简单的小程序。它有一个图标,根据事件而改变。只需用您自己的逻辑替换它的逻辑,它就能起到作用。更好的是,它应该与所有兼容freedesktop的环境兼容。


2
非常好的例子,谢谢。只需根据任务所需的复杂度即可,不要过多。 - Tom Viner
2
我现在创建了一个名为 net-panel 的 Github 项目,满足我的需求。 - Tom Viner
2
我认为指南要求粘贴代码,因为链接有时会失效。请在您的回答中粘贴代码,因为链接确实已经失效了。 - Quidam
@Quidam 这段代码可能在这个仓库中 https://github.com/moonranger/tomate - allprog
2
@static_rtti,我大约两年前使用过你的代码。尝试在我的磁盘上找到它,但是没有找到。很遗憾。 - allprog
显示剩余3条评论

5
作为未来的参考,以下是一份非常好的指南,介绍如何构建 Gnome3 指示器:http://candidtim.github.io/appindicator/2014/09/13/ubuntu-appindicator-step-by-step.html
完整的源代码:
import signal
import json

from urllib2 import Request, urlopen, URLError

from gi.repository import Gtk as gtk
from gi.repository import AppIndicator3 as appindicator
from gi.repository import Notify as notify


APPINDICATOR_ID = 'myappindicator'

def main():
    indicator = appindicator.Indicator.new(APPINDICATOR_ID, 'sample_icon.svg', appindicator.IndicatorCategory.SYSTEM_SERVICES)
    indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
    indicator.set_menu(build_menu())
    notify.init(APPINDICATOR_ID)
    gtk.main()

def build_menu():
    menu = gtk.Menu()
    item_joke = gtk.MenuItem('Joke')
    item_joke.connect('activate', joke)
    menu.append(item_joke)
    item_quit = gtk.MenuItem('Quit')
    item_quit.connect('activate', quit)
    menu.append(item_quit)
    menu.show_all()
    return menu

def fetch_joke():
    request = Request('http://api.icndb.com/jokes/random?limitTo=[nerdy]')
    response = urlopen(request)
    joke = json.loads(response.read())['value']['joke']
    return joke

def joke(_):
    notify.Notification.new("<b>Joke</b>", fetch_joke(), None).show()

def quit(_):
    notify.uninit()
    gtk.main_quit()

if __name__ == "__main__":
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    main()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接