wx.ProgressDialog没有更新bar或newmsg

时间:2010-10-28 18:29:43

标签: python wxpython progress-bar progressdialog

wx.ProgressDialog的更新方法有一个newmsg参数,应该提供有关该过程每个步骤中发生的事情的文本更新,但我的代码没有正确执行此操作。 < / p>

以下是wx.ProgressDialog http://www.wxpython.org/docs/api/wx.ProgressDialog-class.html

文档的链接

此外,当我运行我的代码时,进度条本身在看起来大约完成50%时会停止更新。

有谁能告诉我如何解决这两个问题?

这是我的代码:

import wx
import time

class Frame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, title="ProgressDialog sample")
        self.progressMax = 4
        self.count = 0
        self.newstep='step '+str(self.count)
        self.dialog = None
        self.OnTimer(self.count)

    def OnTimer(self, evt):
        if not self.dialog:
            self.dialog = wx.ProgressDialog("Progress in processing your data.",
                                        self.newstep,
                                        self.progressMax,
                                        style=wx.PD_CAN_ABORT
                                        | wx.PD_APP_MODAL
                                        | wx.PD_SMOOTH
                                        | wx.PD_AUTO_HIDE)
        # Do Step One
        print '----------------------------'
        print 'Starting Step One now.'
        self.count += 1
        self.newstep='step '+str(self.count)
        print 'self.count is:  ',self.count
        print 'self.newstep is:  ',self.newstep
        keepGoing = self.dialog.Update(self.count,self.newstep)
        print '----------------------------'
        time.sleep(5)

        # Do Step Two
        print '----------------------------'
        print 'Starting Step Two now.'
        self.count += 1
        self.newstep='step '+str(self.count)
        print 'self.count is:  ',self.count
        print 'self.newstep is:  ',self.newstep
        keepGoing = self.dialog.Update(self.count,self.newstep)
        print '----------------------------'
        time.sleep(5)

        # Do Step Three
        print '----------------------------'
        print 'Starting Step Three now.'
        self.count += 1
        self.newstep='step '+str(self.count)
        print 'self.count is:  ',self.count
        print 'self.newstep is:  ',self.newstep
        keepGoing = self.dialog.Update(self.count,self.newstep)
        print '----------------------------'
        time.sleep(5)

        # Do Step Four
        print '----------------------------'
        print 'Starting Step Four now.'
        self.count += 1
        self.newstep='step '+str(self.count)
        print 'self.count is:  ',self.count
        print 'self.newstep is:  ',self.newstep
        keepGoing = self.dialog.Update(self.count,self.newstep)
        print '----------------------------'
        time.sleep(5)

        # Delete the progress bar when it is full
        self.dialog.Update(self.progressMax)
        time.sleep(3)
        self.dialog.Destroy()

if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = Frame(None)
    frame.Show()
    app.MainLoop()

请注意,我正在打印所有内容以检查进度。打印命令的结果与进度对话框中显示的结果不同。打印命令似乎正在执行代码告诉他们要执行的操作,但是进度对话框似乎没有执行代码告诉它要执行的操作,并且进度对话框与打印命令的结果不一致。
这是Python的2.6版本。

编辑一个:

----------------------------------------------- --------------------------------

我编辑了上面的代码以匹配adw的建议。不更新newmsg的问题似乎已被消除,但进度条本身似乎仍然只有50%已满,并且当对话框中的newmsg输出显示“步骤3”时会发生这种情况。然后进度条消失。使用该软件的非计算机人员可能会认真地认为该过程仅完成了大约50%的工作,并在步骤3中提前退出。如何编辑代码以使其显示“步骤4”对话框,以便在ProgressDialog被杀之前,进度条实际上会在一两秒内填充100%?

编辑二:

----------------------------------------------- -------------------------------

我将ChrisC建议的更改添加到上面的代码中,如您所见。但是运行这个新改变的代码仍然会产生同样的问题。 因此,当我编辑上述代码时,该建议似乎无法以我理解的形式运行。您能否就上述代码提出具体建议?有什么能使它在您的计算机上运行吗?

3 个答案:

答案 0 :(得分:1)

Python标识符区分大小写,因此newstepnewStep不同。

对于栏本身,当我运行你的代码时,它可以正常工作。虽然我不得不在任何地方将(keepGoing, skip)更改为keepGoing,但可能是版本差异(我有wx.VERSION_STRING == '2.6.3.2')。

答案 1 :(得分:1)

您的问题是wx.PD_AUTO_HIDE。正如文档中所述,使用该样式

  

一旦达到进度表的最大值,就会使进度对话框从屏幕上消失。

将您的代码更改为

self.dialog = wx.ProgressDialog("Progress in processing your data.",
                                    self.newstep,
                                    self.progressMax,
                                    style=wx.PD_CAN_ABORT
                                    | wx.PD_APP_MODAL
                                    | wx.PD_SMOOTH)

然后ChrisC建议的代码将起作用。

答案 2 :(得分:0)

您可以在self.dialog.Update(self.progressMax)之前致电self.dialog.Destroy(),也许可以点time.sleep(1)进行明显停顿吗?