[Python-es] Glade + pygtk -> Dudas

Arnau Sanchez pyarnau en gmail.com
Jue Jun 17 10:44:46 CEST 2010


On Thu, 17 Jun 2010 00:20:35 +0200 Jesús Genicio wrote:

> Traceback (most recent call last):
>   File "termometro.py", line 81, in evento_leer_temperatura
>     Texto= self.label_Temperatura
> AttributeError: App instance has no attribute 'label_Temperatura'

Veamos, tienes:

 class App:  
     def __init__(self):
 		builder = gtk.Builder()
 		builder.add_from_file("termometro.xml") 
 
 		self.window = builder.get_object("Principal")
 		builder.connect_signals(self)
         
     def evento_leer_temperatura(self, widget):
         Texto= self.label_Temperatura

¿Pero en qué punto del programa has hecho que los widgets sean 
atributos de la instancia? builder.connect_signals() conecta callbacks
(usando introspección), nada más. Los widgets los tienes disponibles a
través de builder.get_object:

label = builder.get_object("label_Temperatura")

(Por cierto, ese nombre no parece muy estándar, la gente suele usar
cosas como "label_temperatura", "labelTemperatura",
"LabelTemperatura", ...)

----
¿Me permites algunos comentarios del código? Me tomo la libertad ;-)

> def ftdi():
>     busses = usb.busses()
>     for bus in busses:
>         devices = bus.devices
>         for dev in devices:
>             if dev.idVendor== 1027 and dev.idProduct== 24577:
>                 return 1
>     return 0

Aquí (y en otros sitios) usas 0 como False y 1 como True. ¿Por qué no
booleanos? Más: esa estructura de bucle + condición + return True huele
a any():

def ftdi():
    return any(dev.idVendor == 1027 and dev.idProduct == 24577 
        for bus in usb.busses() for dev in bus.devices)

Conceptualmente parecería más conveniente que la función devolviera el
dispositivo, no un booleano. Para ello puedes preparar una función
first() y usarla en vez del any():

def first(it, default=False):
    return next(it, default)

def ftdi():
    return first(dev for bus in usb.busses() for dev in bus.devices
        if dev.idVendor == 1027 and dev.idProduct == 24577)

> def conectar():
>     if ftdi():
>         puerto= puertos()
>         if puerto != 0:
>             PuertoSerie= serial.Serial(puerto, 19200, timeout= 1)
>             while True:
>                 PuertoSerie.write("T")

Este patrón es bastante usual: condición ó salir, condicion ó
salir, .... Si tuvieras N condiciones la tabulación no daría abasto.

Quizá:

if not ftdi():
    return 
puerto = puertos()
if not puerto:
    return 

...

> if __name__ == "__main__":
>     try:
>         a = App()
>      #   gobject.timeout_add( 1000, a.imprime( a))
>         gtk.main()
>     except KeyboardInterrupt:
>         pass

¿Alguna razón para capturar Control+C? En general es mejor dejarle esas
cosas a Python, a no ser que tu programa tenga que hacer una limpieza
específica.


Más información sobre la lista de distribución Python-es