关于用pyqt5做界面时,执行一个长进程的任务时界面会死一会机的问题

问题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)


参考下PyQt5-多线程的使用

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632