问题1:我用pyqt5做的界面,执行一个长进程的任务时进度条运行界面会死一会机,应该如何增加线程才能使界面在进度条运行任务时主界面也不死机
问题2:我想出发button按钮后进度条执行,同时按钮无法点击并同时显示为计算中,进度条执行100%时,button按钮回复可点击状态,并显示为计算,时刻很多种方法,都不能实现
由于代码过于长,之粘贴了部分代码
#button按钮触发的槽方法
def myTimerState(self, step):
if self.jisuan_pushButton.text() == "计算":
self.progressBar.setValue(0)
self.thread = Thread(target=None, args=(self.progressBar))
self.thread.start()
if self.progressBar.setValue(100):
self.jisuan_pushButton.setText('计算完成')
def timerEvent(self, e):
if self.step >= 100:
self.timer1.stop()
self.jisuan_pushButton.setText("计算完成")
else:
self.step += 1
self.progressBar.setValue(self.step)
#入口
if __name__=='__main__':
app=QApplication(sys.argv)
QToolTip.setFont(QFont('宋体',9))
BladeDataSummary=QMainWindow()
BladeDataSummary.setWindowIcon(QIcon('picture/huizong.png'))
BladeDataSummary.setWindowTitle("BladeData")
ui = BladeData_new.Ui_BladeDataSummary()
ui.setupUi(BladeDataSummary)
BladeDataSummary.show()
sys.exit(app.exec_())
问题一:实现一个线程类,实现run函数即可(把你的耗时处理放在run中处理,并在run中更新进度值,进度值通过信号发送给窗口),进度条使用QProcessBar控件。
线程类示例代码:
from PyQt5.QtCore import QThread, pyqtSignal
#自定义的线程类
class MyThread(QThread):
thread_proess_signal = pyqtSignal(int)
def __init__(self):
super().__init__()
#实现run函数,耗时处理放在这里
def run(self):
#在这里进行你的处理,并更新进度(设置processValue的值)
#proessValue =
#把处理进度发送给主窗口
self.thread_proess_signal.emit(int(proessValue)) # 发射信号
问题二:窗口类中定义槽函数,接收线程的信号,并更新进度条的值,当值为100时(假定进度条的值从0到100),重置按钮的状态。
示例代码如下:(窗口类没写全,只把需要修改和新增的函数写出来了,更新到你的代码中即可)
#主窗口中的处理
#在init_ui()函数中添加按钮并绑定槽函数,以便启动线程
def init_ui(self):
#设置开始计算按钮,并绑定按钮的槽函数
self.btn = QPushButton("计算")
self.btn.clicked.connect(self.start_thread)
# 设置进度条的属性
self.pgb = QProgressBar(self)
self.pgb.move(50, 50)
self.pgb.resize(250, 20)
# 设置进度条的范围
self.pgb.setMinimum(0)
self.pgb.setMaximum(100)
self.pgb.setValue(0)
#实例化线程
self.mythread = MyThread()
self.mythread.thread_proess_signal.connect(self.change_process_value)
# 按钮响应函数,启动线程并禁用按钮
def start_thread(self):
# 禁用按钮
self.btn.setText("计算中...")
self.btn.setEnabled(False)
# 启动线程
self.mythread.start()
# 线程信号响应函数,更新进度条的值,当处理完时重置按钮状态
def change_process_value(self, value):
self.pgb.setValue(0)
# 重新启用按钮
if value == 100:
self.btn.setText("计算")
self.btn.setEnabled(True)
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!