PyQt使用进度条似乎不是渐进的

时间:2018-04-08 10:26:03

标签: python-3.x progress-bar qmainwindow

以下代码用于在读取24行文件时更新进度条。该计时器用于演示较长时间内发生的事情。

实际发生的是整个文件逐行读取,然后进度条最后一次更新。

我认为这是关于文件对话框打开或线程化的某种焦点问题。

    for x in range(0, i):
          print ("We're on line",x)
          line=f.readline()
          time.sleep(0.3)
          self.ui.textEdit.append(line)
          self.ui.progressBar.setProperty("value", i*4)    
    f.close()

文件对话框(有效)

file_name = QFileDialog.getOpenFileName(self, "select file")

完整的代码如下所示,打印调试乱七八糟

class MainWindow(QMainWindow):
def __init__(self):
    super(MainWindow, self).__init__()

    # Set up the user interface
    self.ui = Ui_MainWindow()
    self.ui.setupUi(self)
    self.ui.textEdit.setAlignment(QtCore.Qt.AlignLeft)
    self.ui.btn_load_data.clicked.connect(self.browse_for_file)
    self.show()

def browse_for_file(self):
    file_name = QFileDialog.getOpenFileName(self, "select file")
    i = 0
    print(file_name)
    self.ui.textEdit.append("Just going in")
    with open(file_name[0]) as file:
        for line in file:
            i += 1
    f = open(file_name[0], "r")
    print("lines in file is ",i)
    for x in range(0, i):
        print ("We're on line",x)
        line=f.readline()
        time.sleep(0.3)
        self.ui.textEdit.append(line)
        self.ui.progressBar.setProperty("value", i*4)    
    f.close()
app = QApplication(sys.argv)
window = MainWindow()
app.exec_()

1 个答案:

答案 0 :(得分:1)

问题发生的原因是在事件循环中绘制了用户界面,并且您的代码没有返回到事件循环。在某个函数运行时处理事件的一种方法是使用QApplication.processEvents(),如:

for x in range(0, i):
      print ("We're on line",x)
      line=f.readline()
      time.sleep(0.3)
      self.ui.textEdit.append(line)
      self.ui.progressBar.setProperty("value", i*4)
      QApplication.processEvents()
f.close()

这将允许处理事件,包括绘制用户界面。