Actualización del elemento de la GUI de Python desde Qthread
Así que sé que hay muchas publicaciones sobre la actualización de elementos en una GUI con Qthread. Hice todo lo posible para repasar estos, pero todavía tengo una pregunta.
Estoy tratando de crear una GUI que ejecute un método cuando se hace clic en un botón y ese método comienza un nuevo hilo. Entonces ese hilo emite una señal a la GUI para cambiar el valor del elemento GUI:
from PySide import QtCore, QtGui
import time
class WorkerThread(QtCore.QThread):
updateProgress = QtCore.Signal(int)
def __init__(self, countto):
QtCore.QThread.__init__(self)
self.countto = countto
def run(self):
i = 0
while i <= self.countto:
print(self.countto)
self.updateProgress.emit(i)
time.sleep(1)
i += 1
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 300)
self.progressBar = QtGui.QProgressBar(Dialog)
self.progressBar.setGeometry(QtCore.QRect(110, 120, 118, 23))
self.progressBar.setProperty("value", 0)
self.progressBar.setObjectName("progressBar")
self.lineEdit = QtGui.QLineEdit(Dialog)
self.lineEdit.setGeometry(QtCore.QRect(50, 60, 113, 20))
self.lineEdit.setObjectName("lineEdit")
self.pushButton = QtGui.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(190, 60, 75, 23))
self.pushButton.setObjectName("pushButton")
self.wt = WorkerThread(int)
self.wt.updateProgress.connect(self.setProgress)
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.setText(QtGui.QApplication.translate("Dialog", "PushButton", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.connect(QtCore.SIGNAL('clicked()'), self.get_time)
def setProgress(self, progress):
self.progressBar.setValue(progress)
def get_time(self):
countto = self.lineEdit.text()
countto = int(countto)
print(countto)
self.wt = WorkerThread(countto)
self.wt.start()
q = 0
while q < 5:
print(countto+2)
time.sleep(2)
q += 1
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
Se supone que esta GUI ejecuta el hilo principal y realiza un recuento arbitrario para asegurarse de que funciona. Luego, el segundo subproceso también realiza un recuento arbitrario para asegurarse de que funciona y luego intenta emitir una señal a la GUI para actualizar elprogressbar
elemento. Sé que ambos subprocesos se están ejecutando, pero creo que tengo problemas para recibir la señal porque elprogressbar
no se actualiza He intentado algunas cosas, pero ahora estoy atascado. Creo que el problema surge cuando intento pasar un valor al hilo y cuando trato de crear una instancia del hilo en el método 'setupUi', solo para redefinirlo más adelante.
¿Alguien podría ayudar y explicar mi error al pensar? Estoy tratando de entenderlo usando señales y ranuras con subprocesos, por lo que una explicación sería genial.