【发布时间】:2015-05-29 22:37:37
【问题描述】:
所以我知道有很多关于使用 Qthread 更新 GUI 中的元素的帖子。我已尽力复习这些,但仍有一个问题。
我正在尝试创建一个 GUI,该 GUI 在单击按钮时运行一个方法,然后该方法启动一个新线程。然后该线程向 GUI 发出信号以更改 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_())
这个 GUI 应该运行主线程并进行一些任意计数以确保它正常工作。然后第二个线程也进行一些任意计数以确保它正常工作,然后尝试向 GUI 发出信号以更新progressbar 元素。我知道两个线程都在运行,但我认为我在接收信号时遇到了问题,因为progressbar 没有更新。我已经尝试了一些东西,但现在我被卡住了。我认为当我尝试将值传递给线程并且尝试在“setupUi”方法中创建线程的实例时出现问题,只是稍后重新定义它。
谁能帮助解释我的思维错误?我正在尝试使用带有线程的信号和插槽来解决问题,所以解释一下会很好。
【问题讨论】:
标签: python-2.7 pyqt qthread