我需要在我的wxpython应用程序中包含一个进度条,但是我发现的示例使用了一个从固定时间长度开始倒计时的计时器。由于我不知道给定计算机运行我的进程需要多长时间,因此我希望进度条只需在每个特定步骤完成时更新。
我修改了一些示例代码来完成此操作,但会引发以下错误:
path/ProgressDialog.py", line 31, in OnTimer
(keepGoing, skip) = self.dialog.Update(self.count)
File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_windows.py", line 2971, in Update
return _windows_.ProgressDialog_Update(*args, **kwargs)
PyAssertionError: C++ assertion "value <= m_maximum" failed at ..\..\src\generic\progdlgg.cpp(337) in wxProgressDialog::Update(): invalid progress value
当我在下面的代码中添加try ... except语句时,它不会抛出错误,但我认为必须有一个更好的方法,而不是简单地在错误消息上绘制一个遮羞布。
有人可以告诉我如何修复我的代码吗?
我的代码如下,包括“删除”错误的try ... except语句:
import wx
import time
class Frame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, title="ProgressDialog sample")
self.progressMax = 7
self.count = 0
self.dialog = None
#self.timer = wx.Timer(self)
#self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
#self.timer.Start(1000)
self.OnTimer(self.count)
def OnTimer(self, evt):
try:
if not self.dialog:
self.dialog = wx.ProgressDialog("A progress box", "Time remaining",
self.progressMax,
style=wx.PD_CAN_ABORT
| wx.PD_ELAPSED_TIME
| wx.PD_REMAINING_TIME
| wx.PD_ESTIMATED_TIME
| wx.PD_AUTO_HIDE)
while self.count < 8:
self.count += 1
if wx.VERSION < (2,7,1,1):
keepGoing = self.dialog.Update(self.count)
else:
(keepGoing, skip) = self.dialog.Update(self.count)
time.sleep(2)
if not keepGoing or self.count == self.progressMax:
self.dialog.Destroy()
#self.timer.Stop()
except:
pass
if __name__ == "__main__":
app = wx.PySimpleApp()
frame = Frame(None)
frame.Show()
app.MainLoop()
注意:在测试此代码时,我正在使用while循环来模拟单步执行流程步骤。但在实际实现中,每次self.count增加1之前,我都会有一个特定的流程步骤。
答案 0 :(得分:1)
你的progressMax
为7且循环循环而count
小于8,但你在循环的第一行增加count
,所以你有一个迭代{{1是8,这是进度条的非法值。
将while条件更改为count
(方便count < 7
)或将count < progressMax
增量移至循环结束。