(wxPython) wx.ProgressDialog - how to cancel out of?

7stud bbxx789_05ss at yahoo.com
Sun Sep 16 00:50:23 CEST 2007


Terry Carroll wrote:
> I'm trying to use wx.ProgressBar, and the cancel button is not
> responding.
>
> Here is a simple program that exhibits the problem:
>
> #########################################################
> import  wx
> import time
>
> max = 10
> app = wx.PySimpleApp()
> dlg = wx.ProgressDialog("Progress dialog example",
>                        "variables to be shown here",
>                        maximum = max,
>                        style = wx.PD_CAN_ABORT
>                         | wx.PD_CAN_SKIP
>                         #| wx.PD_APP_MODAL
>                         | wx.PD_ELAPSED_TIME
>                         | wx.PD_ESTIMATED_TIME
>                         | wx.PD_REMAINING_TIME
>                         )
>
> keepGoing = True
> skip = False
> count = 0
>
> while keepGoing and count < max:
>     count += 1
>     wx.MilliSleep(1000)
>     #time.sleep(1)
>     newtext = "(before) count: %s, keepGoing: %s, skip: %s " % \
>               (count, keepGoing, skip)
>     print newtext
>     (keepGoing, skip) = dlg.Update(count, newtext)
>     newtext = "(after) count: %s, keepGoing: %s, skip: %s " % \
>               (count, keepGoing, skip)
>     print newtext
> dlg.Destroy()
> #########################################################
>
> The dialog looks right when this runs, but....
>
> What's right: I get a progress bar;  it includes "Skip" and "Cancel"
> buttons; it shows 10 seconds of progress, and updates once per second
> with the variables' values on each iteration.
>
> What's wrong is that I can't get clicking on the "Skip" or "Cancel"
> buttons to have any effect.  Instead, as soon as the dialog displays,
> I get an hourglass, and it doesn't matter what I click on.  Here's
> what the print statements display, consistently, regardless of what I
> try to click or whether I click nothing at all:
>
> I:\python>test1.py
> (before) count: 1, keepGoing: True, skip: False
> (after) count: 1, keepGoing: True, skip: False
> (before) count: 2, keepGoing: True, skip: False
> (after) count: 2, keepGoing: True, skip: True
> (before) count: 3, keepGoing: True, skip: True
> (after) count: 3, keepGoing: True, skip: True
> (before) count: 4, keepGoing: True, skip: True
> (after) count: 4, keepGoing: True, skip: True
> (before) count: 5, keepGoing: True, skip: True
> (after) count: 5, keepGoing: True, skip: True
> (before) count: 6, keepGoing: True, skip: True
> (after) count: 6, keepGoing: True, skip: True
> (before) count: 7, keepGoing: True, skip: True
> (after) count: 7, keepGoing: True, skip: True
> (before) count: 8, keepGoing: True, skip: True
> (after) count: 8, keepGoing: True, skip: True
> (before) count: 9, keepGoing: True, skip: True
> (after) count: 9, keepGoing: True, skip: True
> (before) count: 10, keepGoing: True, skip: True
> (after) count: 10, keepGoing: True, skip: True
>
> Two oddities here:
>
> 1) As I read the docs, the keepGoing variable should be set to True,
> unless I click on "Cancel," in which case it should be set to False
> (which would end the loop).  That doesn't happen.  This is really what
> I'm most concerned here with.
>
> 2) The variable "skip: set to False on the first iteration, and then
> set to True on subsequent iterations?  Note that this happens even if
> no buttons are selected.  This is just a weirdness to me, and not my
> main concern, but I thought I'd mention it in case it's relevant.
>
> You can see some variations in the commented-out code that I tried;
> they did not help.
>
> Relevant software and releases:
>
> OS: Windows XP Home Edition, Version 2002, SP2
> Python: ActivePython 2.5.0.0
> wxPython: 2.8.1.1 (msw-unicode)
>
> Any help appreciated.

Or, if you want the progress dialog to start when your app starts--
rather than after a user clicks on a button--you can use a short
timer:

import wx

app = wx.PySimpleApp()

win = wx.Frame(None, -1, "Test Progress Dialog")
timer = wx.Timer(win)
#win.Bind(wx.EVT_TIMER, on_timer_expiry, timer)

def on_timer_expiry(evt):
    max = 10
    dialog = wx.ProgressDialog(
            "Loading",
            "progress:",
            max,
            style = wx.PD_CAN_ABORT
                |wx.PD_ELAPSED_TIME
                |wx.PD_ESTIMATED_TIME
                |wx.PD_REMAINING_TIME
    )


    keep_going = True
    skip = False
    count = 0
    while keep_going and (count < max):
        count += 1
        wx.MilliSleep(1000)

        (keep_going, skip) = dialog.Update(count)
        print skip

    dialog.Destroy()
    timer.Stop()

win.Bind(wx.EVT_TIMER, on_timer_expiry, timer)
timer.Start(1000)

win.Show()
app.MainLoop()




More information about the Python-list mailing list