首页 > 解决方案 > 即使使用 QThread,pyqt5 GUI 也会冻结

问题描述

我正在尝试制作一个桌面应用程序并希望实现线程,以便应用程序在运行大型任务时不会冻结。但是当我尝试使用 Qthread 应用程序正在运行但变得无响应时。下面添加的代码是我的主要代码的粗略,我什至附上了 qt 设计器为对话框生成的代码。

粗略的代码

import time
from progress import Ui_Dialog
from PyQt5.QtCore import QObject, QThread, QTimer, pyqtSignal
from PyQt5 import QtWidgets

class Progress_dialog(QtWidgets.QDialog):
    def __init__(self):
        super(Progress_dialog, self).__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.timer = QTimer(self)

        self.btn_1 = QtWidgets.QPushButton('click me', self)
        self.btn_1.move(150,0)
        self.btn_1.clicked.connect(self.startworker_1)

        self.bar = self.ui.progressBar

    def startworker_1(self):
        self.thred = QThread()
        self.thred.start()
        self.thred.started.connect(self.progress_bar)
    
    def progress_bar(self):
        import time
        QtWidgets.QApplication.processEvents()
        for cnt in range(1,101):
            time.sleep(0.1)
            self.bar.setValue(cnt)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    main = Progress_dialog()
    main.show()
    sys.exit(app.exec_())

图形用户界面脚本

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 425)
        self.listWidget = QtWidgets.QListWidget(Dialog)
        self.listWidget.setGeometry(QtCore.QRect(0, 0, 400, 351))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift")
        font.setPointSize(10)
        self.listWidget.setFont(font)
        self.listWidget.setObjectName("listWidget")
        self.progressBar = QtWidgets.QProgressBar(Dialog)
        self.progressBar.setGeometry(QtCore.QRect(20, 380, 371, 21))
        self.progressBar.setValue(0)
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(100)
        font = QtGui.QFont()
        font.setFamily("Bahnschrift")
        font.setPointSize(12)
        font.setBold(False)
        font.setWeight(50)
        self.progressBar.setFont(font)
        self.progressBar.setObjectName("progressBar")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

任何有QT经验的人都可以回答

标签: pythonmultithreadingqtuser-interfacepyqt

解决方案


推荐阅读