我想使用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)
或者有更好的方法吗?
答案 0 :(得分:2)
这是一个普遍的问题。 (除非你已经在另一个线程上运行了这个,否则你会阻止整个用户界面,而不仅仅是没有更新进度条,对吧?)有两种通用方法可以解决它。
将回调传递给runPrediction,并在循环,每Y%或每Z秒每隔X次调用progressCallback(sofar, total)
。 (您可以使用其他一些通信机制 - 发布到队列并触发条件,通过管道或套接字发送消息等等 - 但这个想法是相同的。)
将run run预测分解为可以按顺序运行的单独的较小作业,并在每次开始下一个作业时更新进度。
你的解决方案基本上是一个略显笨拙,但往往是完全合理的第二个想法的版本。如果没有明确的方法可以打破这份工作,但是有一种合理的方法可以中止工作,躲藏在哪里,然后再恢复,这与打破工作实际上是一样的,对吗?
Python提供了一种更简单,更简洁的方法来实现第二个想法:将runPrediction转换为生成器,在生成结果时生成结果,而不是在结束时返回所有结果。然后,您只需在每个值返回时更新进度。