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

Andrey Antoukh andsux en gmail.com
Sab Feb 26 21:09:28 CET 2011


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"


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