爱问问题的编程小白 2022-05-19 20:22 采纳率: 75%
浏览 216
已结题

关于用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_())


  • 写回答

3条回答 默认 最新

  • 关注

    问题一:实现一个线程类,实现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)
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月31日
  • 已采纳回答 5月23日
  • 修改了问题 5月19日
  • 修改了问题 5月19日
  • 展开全部

悬赏问题

  • ¥15 单片机配网,继电器开关,广播
  • ¥60 Qcustomplot绘制实时动态曲线
  • ¥20 运用matlab画x-y图
  • ¥15 用idea运行项目,运行tomcat报错:断言失败
  • ¥15 Sqlserver查询链接服务器数据问题
  • ¥15 Bibtex4Word 引用中文文献
  • ¥20 用opencv c/c++ 转换成灰度图,然后做一下直方图均衡,输出mp4文件
  • ¥20 matlab中的双层数值积分
  • ¥50 服务器打印水晶报表问题
  • ¥30 gradle环境下javafx项目如何使用druid连接池