[pyar] Alguien ha trabajado con QThread de PyQt?
Martin Alderete
malderete en gmail.com
Jue Jul 16 12:27:50 ART 2015
Buenas!
Como va?
Generalmente para que un QThread "se comunique" con el Main-thread (la UI)
podes emitir "señales" (signals de QT) desde el thread porque QThread
hereda de QObject y manejas la señal desde el main thread.
Ejemplo:
desde el QThread haces algo como:
from PyQt4.QtCore import pyqtSignal
self.newDataSignal = pyqtSignal(str)
#mas codigo
#emitis la señal porque tenes datos
self.newDataSignal.emit(data)
desde el que llama al QThread algo como:
self.thread = TuQThread()
# conectas la señal
self.thread.newDataSignal.connect(self._on_new_data)
#lanzas el thread
self.start()
def _on_new_data(self, data):
#aca procesas los datos
#mostrarlos en algun widget o lo que desees
Ojo! es un ejemplo sin probar solo borrador para que veas la idea....
Mas info podes buscar en la doc de QT:
http://doc.qt.io/qt-4.8/signalsandslots.html
Espero te sirva
saludos!
2015-07-16 11:33 GMT-03:00 Alberto Perez <ksian1685 en gmail.com>:
> Quizás alguno de ustedes pueda ayudarme. Resulta que tengo que presentar
> un TP para un final. La idea que se me ocurrió en un principio era bastante
> fácil: un chat en python, pero tuve la pésima idea de agregarle un entorno
> grafico para hacerlo más vistoso. Y ahí está el asunto de este mensaje:
> cuando lanzo el hilo de la siguiente forma :
>
> e=threading.Thread(target=mensa.escuchar)
>
> e.start()
>
> me tira un error porque debería ser QThread. Ahora cree la clase Thread
> para manejar Qthread, pero me tira error porque no puedo acceder a
> qtextedit desde Thread. Mi error parece ser un tema de jerarquías
>
>
>
> import *threading*
>
> import *sys*
>
> from *socket **import** **
>
> from *PyQt4.QtGui **import** **
>
> from PyQt4 import *QtCore*
>
> from *PyQt4.QtCore **import** **
>
> from Tkinter import *Widget*
>
> from time import *sleep*
>
>
>
> class *QWid*(QWidget):
>
> def *__init__*(*self*):
>
> super(QWid, *self*).__init__()
>
> *self*.setWindowTitle(*"Cliente"*)
>
> #self.setWindowTitle("*Cliente*")
>
> #self.recibido=QTextEdit()
>
> boton= QPushButton (*"mandar mesaje"*, *self*)
>
>
>
> mensa=QTextEdit()
>
> layout_horizontal=QHBoxLayout(*self*)
>
> layout_horizontal.addWidget(mensa)
>
> layout_horizontal.addWidget(boton)
>
>
>
> #layout_horizontal.addWidget(self.recibido)
>
>
>
> #e=threading.Thread(target=mensa.escuchar)
>
> #e.start()
>
>
>
> *self*.thread = Thread()
>
> *self*.thread.start()
>
>
>
> #QThread.currentThread(mensa.escuchar())
>
>
>
> #boton.clicked.connect(mensa.escuchar)
>
>
>
> *self*.resize(800,600)
>
> #boton.clicked.connect(self.escribir)
>
> #mensa.escuchar()
>
>
>
> def *escribir*(*self*):
>
> s = socket(AF_INET, SOCK_STREAM)
>
> s.connect((*"127.0.0.1"*, 1685))
>
>
>
> #*datos*="*prueba*"
>
> datos=*self*.recibido.toPlainText()
>
>
>
> s.send(datos)
>
> s.close()
>
>
>
> class *Thread*(QThread):
>
> def *__init__*(*self*):
>
> QThread.__init__(*self*)
>
>
>
> def *run*(*self*):
>
>
>
> data=None
>
> s=socket(AF_INET,SOCK_STREAM)
>
> s.bind((*"127.0.0.1"*, 1685))
>
> s.listen(10)
>
> (clientsocket,*direct*) = s.accept()
>
>
>
> while 1:
>
> data=clientsocket.recv(1024)
>
> #QTextEdit.setPlainText(data)
>
> *self*.setPlainText(data)
>
> clientsocket.close()
>
>
>
>
>
>
>
> #class QTextEditMod(QTextEdit):
>
> # *def* __init__(self):
>
> # super(QTextEditMod, self).__init__()
>
>
>
>
>
> # *def* *escuchar*(self):
>
> # data=None
>
> # s=socket(AF_INET,SOCK_STREAM)
>
> # s.bind(("127.0.0.1", 1685))
>
> # s.listen(10)
>
> # (*clientsocket*,direct) = s.accept()
>
> # while 1:
>
> # data=clientsocket.recv(1024)
>
> # self.setPlainText(data)
>
> # clientsocket.close()
>
>
>
>
>
> if __name__ == *'__main__'*:
>
> app= QApplication(sys.argv)
>
> w= QWid()
>
> w.show()
>
> sys.exit(app.exec_())
>
>
> Alguien tiene idea de cómo arreglarlo. O una guia de python para entender
> como es la comunicacion entre procesos QThread?
>
> El 11 de julio de 2015, 16:39, Enrique Alejandro Villafañe <
> villafane.enrique en gmail.com> escribió:
>
>> Bueno he estado leyendo y hasta el momento con su ayuda logre migrar de
>> Threads de Python a QThread, ya estoy creando poco a poco la interfaz. Si
>> me trabo en algun paso les estare avisando a ver si me pueden ayudar, en
>> cuanto el proyecto este terminado se los hago llegar por aca, es un
>> proyecto personal asi que me gustaria compartirlo a ver si hay algo que
>> mejorar en el codigo que me puedan recomendar, que seguramente que si
>> porque apenas es mi primera aplicacion.
>>
>> Gracias
>>
>> El 11 de julio de 2015, 13:14, Sebastián Seba <ssebastianj en gmail.com>
>> escribió:
>>
>>> El 10 de julio de 2015, 21:38, Gabriel Acosta <
>>> acostadariogabriel en gmail.com> escribió:
>>>
>>>> El funcionamiento es básicamente el mismo a thread de Python, con la
>>>> diferencia que con QThread al heredar de QObject, podes emitir, conectar
>>>> señales.
>>>>
>>>> class Thread(QThread):
>>>> def __init__(self):
>>>> QThread.__init__(self)
>>>>
>>>> def run(self):
>>>> pass
>>>>
>>>> El método run() se ejecuta cuando inicias el thread:
>>>>
>>>> self.thread = Thread()
>>>> self.thread.start()
>>>>
>>>> Saludos.
>>>>
>>>> Gabriel Acosta
>>>> http://centaurialpha.github.io
>>>> On Jul 10, 2015 8:27 PM, "Enrique Alejandro Villafañe" <
>>>> villafane.enrique en gmail.com> wrote:
>>>>
>>>>> Nuevamente escribo con algo referente a las interfaces graficas, ya me
>>>>> he estudiado el uso de PyQt y gracias a los tutoriales de Gabriel Acosta he
>>>>> entendido el funcionamiento basico de los widgets y las funciones, pero
>>>>> resulta que para mi necesidad la cosa va mas complicada de lo que parecia,
>>>>> yo tengo una aplicacion que se encarga de escuchar por puerto serial unas
>>>>> tramas, mi aplicacion gracias al modulo threads de python maneja varios
>>>>> puertos al mismo tiempo y hasta ahi todo el proceso perfecto, el problema
>>>>> es que ahora para hacerle interfaz grafica mi idea es sencilla, una ventana
>>>>> con algunos tabs y dentro de los tabs unas tablas, de acuerdo a la cantidad
>>>>> de puertos que tenga en un txt que ya existe y funciona, deberian crearse
>>>>> la cantidad de tabs y sus tablas internas para insertar alli de modo visual
>>>>> lo que va llegando en cada puerto por separado en cada tab. Segun he estado
>>>>> leyendo para eso tengo que olvidarme del modulo thread de python y trabajar
>>>>> con el modulo Qthread de PyQt del que solo consegui documentacion en ingles
>>>>> y realmente no soy muy bueno con ello, aparte de que es mi primera
>>>>> aplicacion "compleja" real en la que trabajo y no estoy muy diestro. Si
>>>>> alguien ha utilizado este modulo y me puede explicar como funciona estare
>>>>> muy agradecido.
>>>>>
>>>>> Saludos
>>>>>
>>>>> --
>>>>> Enrique A Villafañe
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> pyar mailing list pyar en python.org.ar
>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>
>>>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>>>>
>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>>>> Argentina - http://www.usla.org.ar
>>>>>
>>>>
>>>> _______________________________________________
>>>> pyar mailing list pyar en python.org.ar
>>>> http://listas.python.org.ar/listinfo/pyar
>>>>
>>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>>>
>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>>> Argentina - http://www.usla.org.ar
>>>>
>>>
>>> Yo hace unos años hice un proyecto similar para un cliente, donde una
>>> aplicación en Python (y con UI hecha en PyQt) tenía que leer y escribir
>>> tramas en el puerto serie. No puedo mostrar código pero recuerdo que en ese
>>> entonces no utilicé QThread sino Threading de Python solamente y no tuve
>>> problemas en actualizar la UI. El tema está en utilizar Queue adecuadamente
>>> y mínimamente me sirvió.
>>>
>>> Así como comenta Gabriel, las interfaces de QThread de PyQt son bastante
>>> similares (sino iguales) a las de Thread de Python pero con agregados
>>> copados como las señales. Por ejemplo, una porción de código que encontré y
>>> modifiqué era algo como:
>>>
>>> class CalcularWorker(QtCore.QObject):
>>> def __init__(self):
>>> pass
>>>
>>> class MainWindow(QtGui.QMainWindow):
>>> ...
>>>
>>> calcular_thread = QtCore.QThread(self) #
>>> Instanciar un QThread
>>> calcular_worker = CalcularWorker(1, 2, 3) #
>>> Instanciar un worker para que realice el cálculo heavy
>>> calcular_worker.moveToThread(calcular_thread) # Mover cálculo
>>> heavy al thread
>>>
>>> calcular_thread.finished.connect(lambda:
>>> self.hacer_algo_al_terminar()) # Al finalizar ejecución del thread,
>>> hacer algo.
>>> calcular_thread.start() # Ejecutar thread.
>>>
>>>
>>> Dependiendo del caso, fijate si te conviene crear una nueva clase que
>>> herede de QThread y en esa clase implementar el método "run" o simplemente
>>> instanciar un QThread y pasarle como argumento la función.
>>>
>>> Saludos.
>>>
>>> --
>>>
>>> *Sebastián J. Seba*
>>>
>>> _______________________________________________
>>> pyar mailing list pyar en python.org.ar
>>> http://listas.python.org.ar/listinfo/pyar
>>>
>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>>
>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>> Argentina - http://www.usla.org.ar
>>>
>>
>>
>>
>> --
>> Enrique A Villafañe
>>
>> *Telefonos de Contacto*
>>
>> Celular : +58 412 5151603
>> Oficina: +58 273 5325224 - +58 273 5321592 - +58 273 5325527
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
--
Martin Alderete
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20150716/14499301/attachment-0001.html>
More information about the pyar
mailing list