import wx
import wx.wizard
import time
import sys

padding = 5
class WizardPage(wx.wizard.PyWizardPage):
    def __init__(self, parent, title):
        wx.wizard.PyWizardPage.__init__(self, parent)
        self.next = self.prev = None
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        title = wx.StaticText(self, -1, title)
        title.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))
        self.sizer.Add(title, 0, wx.ALIGN_LEFT|wx.ALL, padding)
        self.SetSizer(self.sizer)
    def add_stuff(self, stuff):
        self.sizer.Add(stuff, 0, wx.EXPAND|wx.ALL, padding)
    def SetNext(self, next):
        self.next = next
    def SetPrev(self, prev):
        self.prev = prev
    def GetNext(self):
        return self.next
    def GetPrev(self):
        return self.prev

class Wizard(wx.wizard.Wizard):
    def __init__(self, title):
        wx.wizard.Wizard.__init__(self, None, -1, title)
        self.pages = []
        self.Bind(wx.wizard.EVT_WIZARD_PAGE_CHANGED, self.on_page_changed)
    def add_page(self, page):
        if self.pages:
            previous_page = self.pages[-1]
            page.SetPrev(previous_page)
            previous_page.SetNext(page)
        self.pages.append(page)
    def run(self):
        self.RunWizard(self.pages[0])
    def on_page_changed(self, evt):
        page = evt.GetPage()
        direction = evt.GetDirection() and 'f' or 'b'
        if page is self.pages[1] and direction == 'f':
            # make a long running event that 
            # prints status
            sys.stdout = page.stdoutctrl
            for n in range(3):
                print 'Step %d'%n
                time.sleep(1)

if __name__ == '__main__':
    app = wx.PySimpleApp()
    mywiz = Wizard('Simple Wizard')
    mywiz.add_page(WizardPage(mywiz, 'Page 1'))
    page2 = WizardPage(mywiz, 'Page 2')
    ctrl = page2.stdoutctrl = wx.TextCtrl(page2,-1,
        style=wx.BORDER_SIMPLE|
                wx.TE_MULTILINE|
                wx.TE_READONLY|wx.HSCROLL,
        size=(250,160)
        )
    ctrl.MinSize=(250,160)
    page2.add_stuff(ctrl)
    mywiz.add_page(page2)
    mywiz.add_page(WizardPage(mywiz, 'Page 3'))
    mywiz.run()
    mywiz.Destroy()
