TrayIcon en python

En sugus hace poco hemos puesto un sensor de presencia, que basicamente es una webcam que está mirando hacia la pared, y con un programita hecho en python, con pygame, se mira una imagen capturada por la webcam, y se calcula la luminosidad media. Si la luminosidad media es superior a 100, es que la luz de la habitación está encendida. En otro caso es que está apagada, y por tanto no hay nadie. Gracias a este sensor, en la web se puede observar una bolita, que estará roja, o verde, según no haya nadie, o haya alguien en sugus.

A partir de ahí, surgió la idea de llevar eso al escritorio, y como primera aproximación he hecho un icono del sistema en python. Para esto me he basado en uno que tenía por aquí, de un programa que gestiona la conexión a la red, el wicd.

Para poder hacerlo había que tener un acceso al estado de manera rápida y simple, por lo que hice este webservice:

http://sugus.eii.us.es/webservice/hayalguien.php

Que devuelve 1 cuando hay alguien, y 0 cuando no.

Aquí está el código:

import os,sys
import socket
import gtk, gobject, time

tr=None

dir = sys.argv[0]
final = len(dir)
for i in range(len(dir)):
    if dir[len(dir) -1 - i] == '/':
        final = len(dir) - i
        break
dir = dir[0:final]

def set_signal_image():
    s = socket.socket()
    try:
        s.connect(("sugus.eii.us.es", 80))
        s.send("GET /webservice/hayalguien.php\r\n")
        valor = s.recv(1)
        s.close()
    except:
        valor = '0'

    if valor == '1':
        tr.set_from_file(dir+"verde.png")
    else: tr.set_from_file(dir+"rojo.png")
    return True


class TrackerStatusIcon(gtk.StatusIcon):
    def __init__(self):
        gtk.StatusIcon.__init__(self)
        menu = '''
                <ui>
                <menubar name="Menubar">
                <menu action="Menu">
                <menuitem action="About"/>
                <menuitem action="Quit"/>
                </menu>
                </menubar>
                </ui>
        '''
        actions = [
                ('Menu',  None, 'Menu'),
                ('About', gtk.STOCK_ABOUT, '_About...', None, 'About wicd-tray-icon', self.on_about),
                ('Quit',gtk.STOCK_QUIT,'_Quit',None,'Quit wicd-tray-icon', self.on_quit),

                ]
        ag = gtk.ActionGroup('Actions')
        ag.add_actions(actions)
        self.manager = gtk.UIManager()
        self.manager.insert_action_group(ag, 0)
        self.manager.add_ui_from_string(menu)
        self.menu = self.manager.get_widget('/Menubar/Menu/About').props.parent
        self.current_icon_path = ''
        self.set_from_file(dir+"rojo.png")
        self.set_visible(True)
        self.connect('popup-menu', self.on_popup_menu)

    def on_quit(self,widget):
        sys.exit()

    def on_popup_menu(self, status, button, time):
        self.menu.popup(None, None, None, button, time)

    def on_about(self, data):
        dialog = gtk.AboutDialog()
        dialog.set_name('SUGUS sensor')
        dialog.set_version('1.0')
        dialog.set_comments('Este icono te dice si hay alguien en SUGUS')
        dialog.set_website('http://sugus.eii.us.es')
        dialog.run()
        dialog.destroy()

    def set_from_file(self,path):
        if path != self.current_icon_path:
            self.current_icon_path = path
            gtk.StatusIcon.set_from_file(self,path)

tr=TrackerStatusIcon()
gobject.timeout_add(3000,set_signal_image)
gtk.main()

El código con las imagenes, se puede encontrar aquí http://sugus.eii.us.es/~danigm/trayicon.tgz

Para que arranque por defecto, vete a las aplicaciones de arranque de tu escritorio favorito, y añade el comando personalizado:

python /ruta/te/hayas/bajado/esto/sugus.py

Y ya estarás informado en todo momento de cuando hay alguien en sugus, para pasarte por allí a hacer una visita.

5 Respuestas to “TrayIcon en python”


  1. 1 Beno diciembre 13, 2007 a las 12:18 pm

    Mirando un poco el código, me dí cuenta de que si lo ejecutas con ./sugus.py o python sugus.py, no sabía el cacharro donde estaban los archivos de las imágenes, y se volvía loco el susodicho programita. Asi que nada…un par de cutrlineas pa resolver la papeleta y listo.

    dir = sys.argv[0]
    dir2 = dir
    final = len(dir)
    for i in range(len(dir)):
    if dir[len(dir) -1 – i] == ‘/’:
    final = len(dir) – i
    break
    if dir == dir2:
    dir = «./»
    else: dir = dir[0:final]

    Con eso lo que hacemos es decirle que busque los archivos de imágenes en el directorio acual, en el caso de que lo estemos ejecutando desde el mismo directorio del ejecutable…seguramente siga fallando en algunos casos…pero bueno…

  2. 2 Beno diciembre 13, 2007 a las 12:19 pm

    No han salido bien las tabulaciones en el código. A ver si lo puedes poner bien Dani.

  3. 3 danigm diciembre 14, 2007 a las 8:55 am

    Ya lo arreglé, y lo hice igual que lo has hecho tú. Bajatelo otra vez, que creo que lo subí.

  4. 4 albertou diciembre 22, 2007 a las 12:40 pm

    Buenas! Quería agradecer que colgaras el código de la mini-aplicación, ya lo vi el funcionamiento del ‘programita’ cuando lo pusiste en la web de sugus y me gustó mucho.

    Me preguntaba si tienes pensado liberar el código del programa que interactúa con la webcam y el de ‘hayalguien.php’… me gustaría mucho usar algo similar.

    Muchas gracias de antemano.


  1. 1 Código sensor de presencia « danigm Trackback en diciembre 22, 2007 a las 12:59 pm

Replica a Beno Cancelar la respuesta




RSS Sweetter.net

  • Se ha producido un error; es probable que la fuente esté fuera de servicio. Vuelve a intentarlo más tarde.