我想使用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)
predictor是我写的一个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)
或者有更好的方法吗?
最佳答案
这是一个普遍问题。 (除非您已经在另一个线程上运行它,否则您会阻塞整个 UI,而不仅仅是无法更新进度条,对吧?)有两种通用方法可以解决这个问题。
将回调传递给 runPrediction,并使其在循环中每 X 次、每 Y% 或每 Z 秒调用
progressCallback(sofar, Total)
。 (您可以使用其他一些通信机制 - 发布到队列并触发条件,通过管道或套接字发送消息等 - 但想法是相同的。)将 runPrediction 分解为可以按顺序运行的单独的较小作业,并在每次启动下一个作业时更新进度。
您的解决方案基本上是第二个想法的稍微笨拙但通常完全合理的版本。如果没有明确的方法来分解工作,但有一种合理的方法来中止工作,将其隐藏在原来的位置,然后稍后再恢复,那么这实际上与分解工作是一样的,对吗?
Python 提供了一种更简单、更清晰的方法来实现第二个想法:将 runPrediction 转变为生成器,在结果输入时生成结果,而不是在最后返回所有结果。然后,您只需在每个值返回时更新进度即可。关于python - 如何在执行任务时更新进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13653794/