0

wx.ProgressDialog 的 update 方法有一个 newmsg 参数,该参数应该对过程的每个步骤中发生的事情进行文本更新,但是我的代码没有正确执行此操作。

这是 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 建议的更改添加到上面的代码中。但是运行这个新更改的代码仍然会出现同样的问题。 因此,当我编辑上面的代码时,这个建议似乎并没有以我理解的形式起作用。你能建议我对上面的代码做一些具体的事情吗?有什么东西可以让它在你的电脑上运行吗?

4

3 回答 3

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 建议的代码将起作用。

于 2010-10-29T20:03:15.063 回答
1

Python 标识符区分大小写,因此newstep不同于newStep.

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

于 2010-10-28T18:48:34.513 回答
0

self.dialog.Update(self.progressMax)你可以先打电话吗self.dialog.Destroy(),也许是time.sleep(1)一个明显的暂停?

于 2010-10-28T20:24:13.687 回答