PyQt 使用进度条好像不是progressive

PyQt Using a progress bar seems to not be progressive

以下代码用于在读取 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_()

出现问题是因为用户界面是在事件循环内绘制的,而您的代码没有返回到事件循环。在某些函数为 运行 时处理事件的一种方法是使用 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()

这将使事件得到处理,包括用户界面的绘制。