Python中的简单Gnome面板小程序

Tom*_*ner 14 python gnome panel

当我在火车上班时,我将上网本连接到我的Nexus One的wifi热点.当我通过隧道时,我的手机显然会失去它的3G连接,并且在火车出现后需要一段时间重新建立.但上网本wifi标识保持不变,因为它仍然连接到手机本身.

我写了一个小python程序,试图ping服务器,从而决定互联网是否可用(随意建议一种检测互联网连接的方法,可以更快或使用更少的带宽,因为我每月上限).

我的问题是:如何在Python中为GNOME Panel 2.30.2创建一个applet,以图形方式显示这个状态,这样我就可以决定何时继续点击链接并期望互联网正常工作.

我得到了这个带有面板按钮的示例,但是想要一个根据情况而变化的图标.

我已经使用Python几年了但之前没有编码gnome.我在10.04上使用ubuntu桌面版作为我的登录而不是统一.

sta*_*tti 9

看看我制作的这个简单的applet.它有一个图标,根据事件而变化.只需用您的逻辑替换逻辑,它应该可以解决问题.更好的是,它应该与所有与freedesktop兼容的环境兼容.

  • 很好的例子,谢谢.只有任务所需的复杂,而不是更多. (2认同)
  • 我现在创建了一个名为[net-panel](https://github.com/tomviner/net-panel)的github项目,它满足了我的需求. (2认同)
  • 我虽然指南是粘贴代码,因为链接有时可能会死.请将代码粘贴到您的答案中,因为链接确实已经死了. (2认同)
  • @static_rtti大约两年前我使用了你的代码.试图在我的磁盘上找到它,但它无济于事.伤心. (2认同)

s3v*_*v3n 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()
Run Code Online (Sandbox Code Playgroud)