Estoy haciendo una pequeña aplicación con señales y slots en python el problema es que al momento de emitir la señal no funciona el método.
Me puede explicar cómo funcionan los slots y signl en oython porque ya me confundí
¿por qué no se ejecuta mi método run?
from PyQt5.QtWidgets import QLabel,QApplication,QWidget,QVBoxLayoutfrom PyQt5.QtCore import QThread,QRunnable,QObject,pyqtSignal,pyqtSlotimport sysimport time class Worker(QWidget,QRunnable): iniciar = pyqtSignal() label=0 def __init__(self,label,parent=None): print ("iniciando hilos") self.label=label super().__init__(parent) self.iniciar.emit() def run(self): for _x in range (0,10): self.label.setText(self.label.text()+"X") time.sleep(0.5)class hilos(QWidget): def __init__(self,parent=None): super().__init__(parent) self.ventana=QWidget(self) self.ventana.setGeometry( 10,10,800,200) self.label = QLabel("Valor de x-->") self.layout= QVBoxLayout(self) self.layout.addWidget(self.label) self.ventana.setLayout(self.layout) def ejecutar(self): worker=Worker(self.label) thread=QThread() worker.moveToThread(thread) worker.iniciar.connect(lambda:self.cambio( )) thread.start( ) @pyqtSlot( ) def cambio(self): self.label.setText("WOW") time.sleep(4)app=QApplication([ ] )instancia=hilos()instancia.ejecutar( )instancia.show( )sys.exit(app.exec_())
from PyQt5.QtWidgets import QLabel, QApplication, QWidget, QVBoxLayout from PyQt5.QtCore import QThreadPool,QThread , QRunnable, QObject, pyqtSignal, pyqtSlot import sys import time
Esta es la clase wrapper le añadi una señal llamada finished que segun yo deberia de emitirla
class Wrapper(QObject): started = pyqtSignal() finished=pyqtSignal(int) textChanged = pyqtSignal(str)
class Worker(QRunnable): def __init__(self, text): super().__init__() self._text = text self._wrapper = Wrapper() self.started = self._wrapper.started self.textChanged = self._wrapper.textChanged self.finished=self._wrapper.finished @property def text(self): return self._text def run(self): print(str(QThread.currentThread().objectName())) #me refiero a como puedo obtener ese nombre ya que el metodo objectName de la clase QThread no funciona o que esta pasando? if QThread.currentThread().objectName()=="HILO_1" and QThread.currentThread().isFinished()==False: time.sleep(3) self.started.emit() for x in range(0, 10): time.sleep(0.5) self.textChanged.emit("{} {}".format(self.text, x)) elif QThread.currentThread().objectName()=="HILO_2" and QThead.currentThread().isFinished()==False: time.sleep(3) self.started.emit() for x in range(0, 20): time.sleep(0.5) self.textChanged.emit("{} {}".format(self.text, x)) else: time.sleep(3) self.started.emit() for x in range(0, 30): time.sleep(0.5) self.textChanged.emit("{} {}".format(self.text, x)) self.finished.emit(1)
class Widget(QWidget): def __init__(self, parent=None): super().__init__(parent) self.label = QLabel("Valor de x-->") self.label2= QLabel("Valor de y-->") self.label3= QLabel("Valor de z-->") lay = QVBoxLayout(self) lay.addWidget(self.label) lay.addWidget(self.label2) lay.addWidget(self.label3) def ejecutar(self): hilo_1=[ ] worker=[ ] nombres_hilos=["HILO_1","HILO_2","HILO_3"] worker.append(Worker(self.label.text())) worker.append(Worker(self.label2.text())) worker.append(Worker(self.label3.text())) for x in range (0,3): if self.label.text( )== "Valor de x-->": worker[x].textChanged.connect(self.label.setText) elif self.label2.text( )== "Valor de y-->": worker[x].textChanged.connect(self.label2.setText) elif self.label2.text( )== "Valor de z-->":worker[x].textChanged.connect(self.label3.setText) worker[x].finished.connect(self.cambio) hilo_1.append(QThreadPool.globalInstance()) #aqui es donde lo asigno pero no se a que objeto lo esto asignando realmente si al hilo o al QThreadPool con el metodo setObjectName si la asignacion es al hilo entonces que esta pasando en el metodo run pero si la asignacion es al QThreadPool como puedo asignarlo al hilo? hilo_1[x].setObjectName(nombres_hilos[x]) hilo_1[x].start(worker[x]) @pyqtSlot() def cambio(self,hilo): hilo.quit()
app = QApplication([])instancia = Widget()instancia.ejecutar()instancia.show()sys.exit(app.exec_())