[Python-es] Glade + pygtk -> Dudas

Jesús Genicio jgenicio en gmail.com
Jue Jun 17 16:49:39 CEST 2010


2010/6/17 Arnau Sanchez <pyarnau en gmail.com>:
> 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")

Hago esto:

    def evento_leer_temperatura(self, widget):
        Texto= builder.get_object("label_Temperatura")
        Texto.modify_font(pango.FontDescription("sans 48"))
        Texto.set_text( conectar())

Y me da el error:

jesus en servidor:~/Programacion/avr/proyectos/Comunicaciones_Serie$
python termometro.py
Traceback (most recent call last):
  File "termometro.py", line 81, in evento_leer_temperatura
    builder= self.Builder()
AttributeError: App instance has no attribute 'Builder'

He modificado el def __init__(self): añadiendo 	self.temp =
builder.get_object("label_Temperatura")

y en:

def evento_leer_temperatura(self, widget):
        Texto= self.temp
        Texto.modify_font(pango.FontDescription("sans 48"))
        Texto.set_text( conectar())

Y me lo lee cada vez que hago click en el botón correspondiente. ¿Te
parece correcto así.?



>
> (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 ;-)

Toda ayuda es bien recibida, muchas gracias. Yo suelo hacer todo en C,
y la verdad el python se me queda grande, al menos de momento. Ahora
bien, una vez veo tu código, está claro que python es "diferente" :))

>
>> 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.
Es debido a que en un futuro próximo, quiero enviarle una orden a la
tarjeta externa, indicándole que ya no es requerida y que lo ha sido
por una acción directa del usuario.

Gracias por la respuesta, y los comentarios.

S2.
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>


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