== Introduction ==

wx.Gauge is a widget that is used when we process lengthy tasks. e.g file copying or data analysis. Users should not think that our application is hanging. 

== What Objects are Involved ==

   * wx.Gauge

   * {{{wxBoxSizer}}}

   * wx.Timer


== Process Overview ==

In our example, we have a simple solution. A task can be started, stopped and can continue after being stopped. 

== Special Concerns ==

 Stock buttons,

{{{
    self.btn1 = wx.Button(panel, wx.ID_OK)
    self.btn2 = wx.Button(panel, wx.ID_STOP)
}}}

  work only on Linux/UNIX.

== Code Sample ==

{{{
#!/usr/bin/python

# gauge.py
# Updated to follow style guidelines

import wx


class MyFrame(wx.Frame):
    def __init__(self, parent, ID, title):
        wx.Frame.__init__(self, parent, ID, title)

        self.timer = wx.Timer(self, 1)
        self.count = 0

        self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)

        panel = wx.Panel(self, -1)
        vbox = wx.BoxSizer(wx.VERTICAL)
        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        hbox3 = wx.BoxSizer(wx.HORIZONTAL)

        self.gauge = wx.Gauge(panel, -1, 50, size=(250, 25))
        self.btn1 = wx.Button(panel, wx.ID_OK)
        self.btn2 = wx.Button(panel, wx.ID_STOP)
        self.text = wx.StaticText(panel, -1, "Task to be done")

        self.Bind(wx.EVT_BUTTON, self.OnOk, self.btn1)
        self.Bind(wx.EVT_BUTTON, self.OnStop, self.btn2)

        hbox1.Add(self.gauge, 1, wx.ALIGN_CENTRE)
        hbox2.Add(self.btn1, 1, wx.RIGHT, 10)
        hbox2.Add(self.btn2, 1)
        hbox3.Add(self.text, 1)
        vbox.Add((0, 50), 0)
        vbox.Add(hbox1, 0, wx.ALIGN_CENTRE)
        vbox.Add((0, 30), 0)
        vbox.Add(hbox2, 1, wx.ALIGN_CENTRE)
        vbox.Add(hbox3, 1, wx.ALIGN_CENTRE)

        panel.SetSizer(vbox)
        self.Centre()

    def OnOk(self, event):
        if self.count >= 50:
            return
        self.timer.Start(100)
        self.text.SetLabel("Task in Progress")

    def OnStop(self, event):
        if self.count == 0 or self.count >= 50 or not self.timer.IsRunning():
            return
        self.timer.Stop()
        self.text.SetLabel("Task Interrupted")
        wx.Bell()

    def OnTimer(self, event):
        self.count = self.count +1
        self.gauge.SetValue(self.count)
        if self.count == 50:
            self.timer.Stop()
            self.text.SetLabel("Task Completed")

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, "gauge.py")
        frame.Show(True)
        return True


app = MyApp(0)
app.MainLoop()
}}}

=== Comments ===

    -jan bodnar