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

Andrey Antoukh andsux en gmail.com
Dom Feb 27 11:16:39 CET 2011


Hola!

Con este cambio solo ejecutas la funcion directamente, de manera
sincrona, sin usar ningun signal. Veo que no leiste la documentacion
que te pase.

QtCore.SIGNAL ya ni se tiene que usar... si tienes que definir un
signal personalizado es tan simple como esto:
self.recibir_y_graficar_gramaticas = pyqtSignal(['bool', 'int',
'QString', 'Transformacion', 'int'])
luego la conectas
self.recibir_y_graficar_gramaticas.connect(self.tu_slot)
y luego la emiltes con
self.recibir_y_graficar_gramaticas.emit(param_bool, param_int,
param_string, param_transformation, param_int)

En este caso no tengo ni idea de lo que es Transformation.
Pero te vuelvo a recomentar que leyeras el codigo.

El día 27 de febrero de 2011 04:57, Rafael Antonio Laverde
<leafar91 en gmail.com> escribió:
>
> 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
>
> --
> さようなら
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>



-- 
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