[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