如何在执行任务时更新进度条

时间:2012-11-30 21:58:43

标签: python multithreading wxpython progress-bar

我想使用wx.ProgressDialog来显示我的程序的进度。我有一个按钮,当按下时运行此功能:

def runmiP(self, event):
    predictor.runPrediction(self.uploadProtInterestField.GetValue(), self.uploadAllProteinsField.GetValue(), self.uploadPfamTextField.GetValue(), \
                   self.edit_eval_all.Value, self.edit_eval_small.Value, self.saveOutputField)

预测器是我写的python包。如何从预测变量中获取进度并在进度条中显示?我只能返回一个值。我应该多次调用它(比如每分钟),还记得它离开的地方,返回它的距离并再次调用它?像

这样的东西
while 1: 
    time.sleep(60)
    predictor.runPrediction(self.uploadProtInterestField.GetValue(), self.uploadAllProteinsField.GetValue(), self.uploadPfamTextField.GetValue(), \
                   self.edit_eval_all.Value, self.edit_eval_small.Value, self.saveOutputField)

或者有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

这是一个普遍的问题。 (除非你已经在另一个线程上运行了这个,否则你会阻止整个用户界面,而不仅仅是没有更新进度条,对吧?)有两种通用方法可以解决它。

  • 将回调传递给runPrediction,并在循环,每Y%或每Z秒每隔X次调用progressCallback(sofar, total)。 (您可以使用其他一些通信机制 - 发布到队列并触发条件,通过管道或套接字发送消息等等 - 但这个想法是相同的。)

  • 将run run预测分解为可以按顺序运行的单独的较小作业,并在每次开始下一个作业时更新进度。

你的解决方案基本上是一个略显笨拙,但往往是完全合理的第二个想法的版本。如果没有明确的方法可以打破这份工作,但是有一种合理的方法可以中止工作,躲藏在哪里,然后再恢复,这与打破工作实际上是一样的,对吗?

Python提供了一种更简单,更简洁的方法来实现第二个想法:将runPrediction转换为生成器,在生成结果时生成结果,而不是在结束时返回所有结果。然后,您只需在每个值返回时更新进度。