python - 即使使用 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经验的人都可以回答
解决方案
推荐阅读
- python - 为什么 (1) 是 int 以及它是如何工作的
- angular - 如何删除 ng-select 中的搜索框
- angular - 将 mixpannel 与 Angular 5 集成
- python - 在 Pandas 中读取带有波斯字符的 excel 文件
- biztalk - 将输出文件命名为 BizTalk 中元素的值
- reactjs - 提交值后如何重置antd datepicker?
- sql - SUM 舍入小数位 2
- c# - Wpf文本框验证控件模板触发文本值
- android - 如何测试返回 DataSource.Factory 的 Dao 方法?
- scala - 如何检查火花流的许多来源