[Python-es] Pyqt error con QtCore.SIGNAL (slot argument type)

Rafael Antonio Laverde leafar91 en gmail.com
Dom Feb 27 04:57:28 CET 2011


El 26 de febrero de 2011 15:09, Andrey Antoukh <andsux en gmail.com> escribió:

> El día 26 de febrero de 2011 20:40, Rafael Antonio Laverde
> <leafar91 en gmail.com> escribió:
> >
> >
> > El 26 de febrero de 2011 13:42, Andrey Antoukh <andsux en gmail.com>
> escribió:
> >>
> >> El día 26 de febrero de 2011 18:39, Rafael Antonio Laverde
> >> <leafar91 en gmail.com> escribió:
> >> > Buenos días...
> >> >
> >> > Estoy realizando un pequeño programa en python con una iterfaz grafica
> >> > en
> >> > pyqt
> >> >
> >> > he sobrescrito un objeto widget el cual realiza un pequeño dibujo,
> >> > dependiendo de un parámetros insertados en la interfaz
> >> >
> >> > y cuando se hace click en el boton de graficar emito la siguiente
> señal:
> >> >
> >> > self.graf.emit(QtCore.SIGNAL("recibir_y_graficar_datos(bool, int,
> >> > QString,
> >> > Transformacion, int)"), self.linea, self.pasos, self.secuencia,
> >> > self.transformacion, self.intervalo)
> >> >
> >> > conectada al widget sobrescrito mediante:
> >> >
> >> > self.connect(self, QtCore.SIGNAL("recibir_y_graficar_datos(bool, int,
> >> > QString, Transformacion, int)"), self.graficar)
> >> >
> >> > ---Trasformacion es una clase que cree y que tiene como atributos un
> >> > diccionario de listas
> >> >
> >> > pero al ejecutarlo me da el siguiente error:
> >> >
> >> > TypeError: type 'Transformacion' is not supported as a slot argument
> >> > type
> >> >
> >> > --mi duda es acerca de como puedo enviar objetos de clases propias
> >> > mediante
> >> > QtCoreSignal, o como acceder desde el objeto graf a los atibutos de la
> >> > ventana
> >> >
> >> > la estructura es mas o menos la siguiente
> >> >
> >> > class Ventana_principal(QWidget, Main_window.Ui_main_window_form):
> >> >     def __init__(self, *args):
> >> >         self.transformacion = self.dic_transformaciones['ninguna']
> #es
> >> > un
> >> > diccionario donde estan guardadas las diferentes transformaciones
> >> >         #otros atributos
> >> >         self.graf = Grafica()
> >> >         self.connect(self.graficar_pushButton,
> >> > QtCore.SIGNAL('clicked()'),
> >> > self.enviar_valores)
> >> >
> >> >        def enviar_valores(self):
> >> >
> >> > self.graf.emit(QtCore.SIGNAL("recibir_y_graficar_gramaticas(bool, int,
> >> > QString, Transformacion, int)"), self.linea, self.pasos,
> self.secuencia,
> >> > self.transformacion, self.intervalo)
> >> >
> >> >
> >> > class Grafica(QtGui.QWidget):
> >> >     super(Grafica, self).__init__()
> >> >     self.connect(self,
> >> > QtCore.SIGNAL("recibir_y_graficar_gramaticas(bool,
> >> > int, QString, Transformacion, int)"), self.graficar)
> >> >
> >> >     def graficar(self, linea, pasos, secuencia, transformacion,
> >> > intervalo):
> >> >         ###algunas operaciones
> >> >
> >> > ...Gracias
> >> >
> >> Hola.
> >> Si no me equivoco, estas usando la manera obsoleta de conectar signals
> >> con slots, yo de ti me leía la documentación de PyQt que lo explica
> >> bastante bien.
> >>
> >> Igual los ejemplos que has pegado aquí, yo personalmente no me aclaro,
> >> seria de agradecer que pegaras el código completo de la parte que
> >> falla en un pastebin, y ademas incluyeras el traceback.
> >>
> >> Igual con estos datos sera mas fácil identificar el problema ademas de
> >> recomendarte que dejes de usar la manera obsoleta de conectar signals
> >> con slots.
> >>
> >> Un saludo.
> >> Andrei.
> >>
> >>
> >> --
> >> http://twitter.com/andsux
> >> http://www.niwi.be
> >> ****
> >> http://www.freebsd.org/
> >> http://www.postgresql.org/
> >> http://www.python.org/
> >> http://www.djangoproject.com/
> >>
> >> "Linux is for people who hate Windows, BSD is for people who love UNIX"
> >> "Social Engineer -> Because there is no patch for human stupidity"
> >> _______________________________________________
> >> Python-es mailing list
> >> Python-es en python.org
> >> http://mail.python.org/mailman/listinfo/python-es
> >> FAQ: http://python-es-faq.wikidot.com/
> >
> > aca dejo el codigo en pastebin http://pastebin.com/baxsFpkq
> >
> > las lineas de interes son: 29 y 248
> >
> > el traceback es:
> >
> > python Implementacion_main_window.py
> > Traceback (most recent call last):
> >  File "Implementacion_main_window.
> > py", line 276, in <module>
> >    main()
> >  File "Implementacion_main_window.py", line 270, in main
> >    vent = Ventana_principal()
> >  File "Implementacion_main_window.py", line 132, in __init__
> >    self.initUI()
> >  File "Implementacion_main_window.py", line 173, in initUI
> >    self.graf = Grafica()
> >  File "Implementacion_main_window.py", line 22, in __init__
> >    self.initUI()
> >  File "Implementacion_main_window.py", line 30, in initUI
> >    int, QString, Transformacion, int)"), self.graficar)
> > TypeError: type 'Transformacion' is not supported as a slot argument type
> >
> > lo acabo de modificar quitando el qtCore.SIGNAL y en cambio llamando al
> > metodo directamente:
> >
> > elimine la linea 29, 30 y cambie la 249, 250 por
> >
> > self.graf.recibir_y_graficar_gramaticas(self.linea, self.pasos,
> > self.secuencia, self.transformacion, self.intervalo)
> >
> > tambien elimine laconversion de la linea 262 y 49
> >
> > parece funcionar.. pero no lo he probabado... porque los errores los da
> en
> > el computador de mi profesor, en el mio funciona bien incluso como estaba
> al
> > principio...
> >
> > me podrían indicar cual es la forma de usar los slots (algunos enlaces),
> la
> > verdad hace muy poco que empecé a programar con pyqt y no sabia que esta
> > forma era obsoleta
> >
> > ..Saludos
> >
> > --
> > さようなら
> >
> > _______________________________________________
> > Python-es mailing list
> > Python-es en python.org
> > http://mail.python.org/mailman/listinfo/python-es
> > FAQ: http://python-es-faq.wikidot.com/
> >
>
> He mirado el código muy por encima y no parece estar mal, aun así,
> revisa esta documentación:
>
> http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html
> Aquí explica la manera nueva, mas pythonica de usar el sistema de
> signal/slot.
>
> Para que entiendas, es que los signals están definidos como una
> especie de "propiedades" por lo que asignar un slot a un signal es tan
> simple como:
> self.tuobj.tusignal.connect(self.tu_slot_method)
>
> si el slot tiene que ser un poco especifico, pues, lo defines con un
> decorador:
>
> @pyqtSlot(int, QObject, QWidget)
> def tu_slot_method(self, arg1, arg2):
>  # lo que tenga que hacer
>
> Pero en muchos casos esto ultimo te lo puedes saltar definiendo
> directamente el método con el numero de parámetros que se espere, y
> pyqt ya lo mapea automáticamente.
>
> Espero haberme explicado.
> Un saludo.
> Andrei.
>
>
>
> --
> http://twitter.com/andsux
> http://www.niwi.be
> ****
> http://www.freebsd.org/
> http://www.postgresql.org/
> http://www.python.org/
> http://www.djangoproject.com/
>
> "Linux is for people who hate Windows, BSD is for people who love UNIX"
> "Social Engineer -> Because there is no patch for human stupidity"
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>

el cambio que había mencionado en el correo anterior a funcionado; de
eliminar este qtCore.SIGNAL y llamar el método así:

self.graf.recibir_y_graficar_gramaticas(self.linea, self.pasos,
self.secuencia, self.transformacion, self.intervalo)

pero todavía me queda la duda de cual es el uso de las qtcore.SIGNAL, porque
por ejemplo el hecho de emitir una señal puede ser remplazado por llamar a
un método publico... como en este caso; que ventajas tiene realizar esto
mediante una qtcore.SIGNAL o mediante un método publico.. (estoy leyendo la
documentación de pyqt, aunque mi ingles no es muy bueno, para ver si aclaro
esta y otras dudas)

..Saludos

-- 
さようなら
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20110226/630aff07/attachment.html>


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