wx.ProgressDialog使用计数器而不是计时器

时间:2010-10-27 22:36:31

标签: python wxpython progress-bar progressdialog

我需要在我的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之前,我都会有一个特定的流程步骤。

1 个答案:

答案 0 :(得分:1)

你的progressMax为7且循环循环而count小于8,但你在循环的第一行增加count,所以你有一个迭代{{1是8,这是进度条的非法值。

将while条件更改为count(方便count < 7)或将count < progressMax增量移至循环结束。