python

2017-02-16 53 views
0

运行时进度状态(如状态栏)我正在尝试为我的Pyqt5 Python代码创建简单的进度状态标签,并在函数执行一堆东西的循环的每次迭代后更新它。我想要更新的标签是“status_label_counter”。下面的代码只显示了创建标签的部分以及我想要使用我提到的功能的确切位置。python

#initialisation code, etc... 

    self.status_label_counter = QLabel() 
    self.status_label_from = QLabel(' from: ') 
    self.status_label_total = QLabel() 
    status_hbox = QHBoxLayout() 
    status_hbox.addStretch() 
    status_hbox.addWidget(self.status_label_counter) 
    status_hbox.addWidget(self.status_label_from) 
    status_hbox.addWidget(self.status_label_total) 
    status_hbox.addStretch() 

    #bunch of other code... 

    def create_ics(self): 
     counter = 0 
     self.status_label_total.setText(str(len(self.groups))) 
     for group in self.groups: 
      #does a bunch of stuff inside 
      group_manager.create_calendar_for(self.rows, group, self.term) 
      counter += 1 
      #for console output 
      print('iteration: ', counter) 
      #trying to update status counter 
      self.status_label_counter.setText(str(counter)) 

问题是,当循环完成嵌套函数时,我只看到两个标签的更新。当我点击一个按钮,要求“create_ics”功能窗口变为非活动状态约5秒时,我会看到控制台上的日志与迭代次数,但没有任何反应。

+0

尝试QApplication.processEvents()循环 – eyllanesc

+0

里面我也建议使用的QThread – eyllanesc

回答

1

视图(Qt)被锁定在您的主线程中,从来没有机会处理其事件循环,从而重绘自己。如果你真的想这样做,这样一来,叫:

self.status_label_counter.repaint() 

在设置文本(如果你有一些复杂的布局测量呼叫QApplication.processEvents()代替)。

但是,更好的选择是在独立的线程中运行你的create_ics()函数,让主线程处理视图和Qt的事件处理。您可以通过标准Python的threading模块或使用Qt自己的QThread:https://nikolak.com/pyqt-threading-tutorial/来完成。

+0

我用QApplication.processEvents(),和它的工作,但处理的时间几乎翻了一倍,我看到它在这个特殊的情况下工作因为这只是几秒钟的事情,但我也会尝试穿线,因为如果物品的数量不是现在的〜200,而是〜5000,那实际上很重要。谢谢! –

+0

处理时间当然会增加 - 即使您不需要它,您也可以在每次调用时初始化Qt的事件循环检查,这就是为什么线程是有用的 - Qt的事件循环有其自己的时间表,并且会定期更新,但在你的情况下它会卡在你的循环中。当你将处理分离到另一个线程时,不会阻塞Qt进行更新。你可以加快你的处理过程,而不需要线程处理,只要在Qt处理事件时添加一个条件,例如''if not counter%1000:QApplication.processEvents()' – zwer