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

关于用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日
  • 展开全部

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来