PYQT5(3)多线程QProgressBar卡死的问题

96
弗兰克万岁
2018.12.22 17:38* 字数 205
def init_progress(parent):
    m = wake_progress()
    parent.progress = m
    m.run()
    if not m.window.isVisible():
        m.window.show()

#激活方法

class wake_progress(QThread):
#线程类
    def __init__(self):
        super().__init__()
        self.window = QMainWindow()
        self.p=''
    def run(self):
        self.p =file_upload_statu_bar(self.window)

class file_upload_statu_bar(progress_bar):
#原始类
    def __init__(self,Form):
        print('progress bar')
        self.window=Form
        super().__init__()
        self.setupUi(Form)
        self.window.show()
    def change(self,name):
        self.label.setText(name)

出现进度条的线程卡死的情况

最后通过参考自知诸狭的文章
其中一段:
对于执行很耗时的程序来说,由于PyQt需要等待程序执行完毕才能进行下一步,这个过程表现在界面上就是卡顿;而如果在执行这个耗时程序时不断地运行QApplication.processEvents(),那么就可以实现一边执行耗时程序,一边刷新页面的功能,会给人一种相对更流畅的感觉,QApplication.processEvents()的使用方法是,在主函数执行耗时操作的地方,加入QApplication.processEvents(),processEvents()函数的使用方法简单来说就是刷新页面。

于是在循环内加入

from PyQt5.QtWidgets import QApplication
def slotAdd(self): 
  for n in range(10): 
  str_n = 'File index {0}'.format(n)
  self.listFile.addItem(str_n) 
  QApplication.processEvents()#这一句是关键
  time.sleep(1) 

就可以成功解决问题

PYQT5进阶日志