Quantcast
Channel: Preguntas activas con las etiquetas pyqt - Stack Overflow en español
Viewing all articles
Browse latest Browse all 77

Problema con slots y signals en python

$
0
0

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 timeEsta 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_())

Viewing all articles
Browse latest Browse all 77

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>