glade
dvilla en gmx.net
dvilla en gmx.net
Mie Ago 20 22:20:23 CEST 2003
Hola:
Soy yo el que no se ha explicado bien. Necesito que el callback sea un método
(pero no un método clase), es decir, que no me sirve un método estático. Esto es
así porque dentro del método tengo que utilzar atributos del objeto actual.
Prueba esto:
import pygtk
pygtk.require("2.0")
import gtk, gtk.glade
class Application:
def __init__(self):
self.widgets = gtk.glade.XML(gladefile)
self.widgets.signal_autoconnect(Application.__dict__)
def on_button1_clicked(self, *args):
print 'hola'
print self, args
app = Application()
gtk.main()
Según te he entendido, tu dices que en 'self' viene la referencia a objeto y en
'args' el GtkWidget, pues no. Prueba y verás que en 'self' viene el
GtkWidget y en 'args' un GdkEvent.
Si haces un diccionario a mano, es decir:
import pygtk
pygtk.require("2.0")
import gtk, gtk.glade
class Application:
def __init__(self):
self.widgets = gtk.glade.XML(gladefile)
callbacks = {"on_button1_clicked": self.on_button1_clicked}
self.widgets.signal_autoconnect(callbacks)
def on_button1_clicked(self, *args):
print 'hola'
print self, args
app = Application()
gtk.main()
Entonces si funciona bien: en 'self' viene la referencia al objeto y en 'args'
vienen el GtkWidget y el GdkEvent. Pero yo quiero saber si se puede hacer con el
signal_autoconnect.
Saludos.
El Wed, 20 Aug 2003 21:26:33 +0200
Lorenzo Gil Sanchez <lgs en sicem.biz> escribió:
> El mi_, 20-08-2003 a las 20:31, dvilla en gmx.net escribi_:
> Hola:
> >
> > Alguien sabe si el signal_autoconnect() de libglade se puede utilizar de
> > modo que los callbacks sean m_todos no-de-clase. Este ejemplo me funciona:
> >
> > import pygtk
> > pygtk.require("2.0")
> >
> > import gtk, gtk.glade
> >
> > class Application:
> > def __init__(self):
> > self.widgets = gtk.glade.XML(gladefile)
> > self.widgets.signal_autoconnect(Application.__dict__)
> >
> > def on_button1_clicked(widget, event):
> > print 'hola'
> >
> >
> > Pero si on_button1_clicked() no es un m_todo de clase, es decir:
> >
> > def on_button1_clicked(self, widget, event):
> > print 'hola'
> >
> > Entonces el autoconnect no se entera y llama a este m_todo con 2 argumentos
> > en lugar de tres. Alguien sabe si se puede hacer?
> >
> > Veamos, tienes un fallo en lo siguiente: El callback para la senial
> > 'clicked' [1] es el siguiente
>
> def callback(button):
> pass
>
>
> o si es un metodo de clase
>
>
> def callback(self, button):
> pass
>
>
> Por eso en tu ejemplo te funciona el metodo para una clase porque tienes la
> suerte de estar dandole 2 argumentos:
>
> def on_button1_clicked(widget, event):
> print hola
>
> si haces esto
>
> def on_button1_clicked(widget, event):
> print widget, event
>
> probablemente te des cuenta que tu argumento widget es en realidad de tipo
> Application y tu argumento event es de tipo gtk.Button
>
> Despues de todo este rollo te respondo a tu pregunta:
>
> import pygtk
> pygtk.require('2.0')
> import gtk
> import gtk.glade
>
> def on_button1_clicked(button):
> print 'hola'
>
> widgets = gtk.glade.XML(gladefile)
> widgets.autoconnect(locals())
>
> No se si me he explicado bien
>
> Lorenzo Gil
>
> [1]
> http://www.moeraki.com/pygtkreference/pygtk2reference/class-gtkbutton.html#signal-gtkbutton--clicked
>
>
Más información sobre la lista de distribución Python-es