Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simple Gnome Panel Applet in Python

When I'm on the train to work I connect my netbook to my Nexus One's wifi hotspot. As I go through a tunnel my phone obviously loses it's 3G connection and takes a while to re-establish once the train emerges. But the netbook wifi logo stays constant as it's still connected to the phone itself.

I've written a little python program that attempts to ping a server and thus decides if internet is available (feel free to suggest a method of detecting internet connection that would be either quicker or use less bandwidth as I am capped per month).

My question is: how can I create an applet for GNOME Panel 2.30.2 in Python, to graphically display this status, so I can decide when to continue clicking links and expecting internet to work.

I got this example with a panel button to work but would like an icon that changes depending on the situation.

I've used Python for a few years haven't but coded gnome before. I'm using the ubuntu desktop edition as my login rather than unity, on 10.04.

like image 766
Tom Viner Avatar asked May 23 '11 08:05

Tom Viner


2 Answers

Check out this simple applet I made. It has an icon that changes depending on events. Simply replace the logic with your logic and it should do the trick. Even better, it should be compatible with all freedesktop-compatible environments.

like image 105
static_rtti Avatar answered Oct 25 '22 10:10

static_rtti


For future reference, a really nice guide on how to build indicators for Gnome3: http://candidtim.github.io/appindicator/2014/09/13/ubuntu-appindicator-step-by-step.html

Complete source code:

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()
like image 39
s3v3n Avatar answered Oct 25 '22 09:10

s3v3n