[pyar] Alguien ha trabajado con QThread de PyQt?

Alberto Perez ksian1685 en gmail.com
Jue Jul 16 11:33:07 ART 2015


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
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20150716/33ee7599/attachment-0001.html>


More information about the pyar mailing list