用Python编写简单的Gnome面板Applet

15 投票
2 回答
8551 浏览
提问于 2025-04-16 18:09

我在上班的路上,通常会把我的小笔记本电脑连接到我的Nexus One手机的wifi热点上。当我经过隧道时,手机的3G信号会断掉,等火车出来后,手机需要一段时间才能重新连接。但是,小笔记本电脑的wifi图标却一直显示连接状态,因为它仍然连着手机。

我写了一个小的Python程序,试图通过ping一个服务器来判断是否有网络可用(如果你有更快或者更省流量的方法来检测网络连接,欢迎告诉我,因为我每月的流量是有限的)。

我想问的是:我该如何用Python为GNOME Panel 2.30.2创建一个小应用程序,以图形化的方式显示这个网络状态,这样我就可以判断什么时候可以继续点击链接,期待网络能正常工作。

我找到这个例子,它有一个面板按钮可以工作,但我希望有一个图标可以根据情况变化。

我用Python已经有几年了,但之前没有编写过gnome的程序。我使用的是Ubuntu桌面版,而不是Unity,版本是10.04。

2 个回答

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()
9

看看我做的这个简单的小程序。它有一个图标,会根据不同的事件而变化。你只需要把里面的逻辑换成你自己的逻辑,就可以实现你想要的功能。更棒的是,它应该能在所有支持freedesktop的环境中使用。

撰写回答