0

我需要在我的 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 之前发生一个具体的流程步骤。

4

1 回答 1

1

progressMax是 7 并且循环循环 whilecount小于 8,但是你count在循环的第一行递增,所以你有一个迭代,其中count8 是进度条的非法值。

将 while 条件更改为count < 7(conveniently count < progressMax) 或将count增量移动到循环的末尾。

于 2010-10-28T07:27:35.917 回答