| 1 | |
| 2 | import wx |
| 3 | import wx.wizard as wiz |
| 4 | import images |
| 5 | |
| 6 | #---------------------------------------------------------------------- |
| 7 | |
| 8 | def makePageTitle(wizPg, title): |
| 9 | sizer = wx.BoxSizer(wx.VERTICAL) |
| 10 | wizPg.SetSizer(sizer) |
| 11 | title = wx.StaticText(wizPg, -1, title) |
| 12 | title.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD)) |
| 13 | sizer.Add(title, 0, wx.ALIGN_CENTRE|wx.ALL, 5) |
| 14 | sizer.Add(wx.StaticLine(wizPg, -1), 0, wx.EXPAND|wx.ALL, 5) |
| 15 | return sizer |
| 16 | |
| 17 | #---------------------------------------------------------------------- |
| 18 | |
| 19 | class TitledPage(wiz.WizardPageSimple): |
| 20 | def __init__(self, parent, title): |
| 21 | wiz.WizardPageSimple.__init__(self, parent) |
| 22 | self.sizer = makePageTitle(self, title) |
| 23 | |
| 24 | |
| 25 | #---------------------------------------------------------------------- |
| 26 | |
| 27 | class SkipNextPage(wiz.PyWizardPage): |
| 28 | def __init__(self, parent, title): |
| 29 | wiz.PyWizardPage.__init__(self, parent) |
| 30 | self.next = self.prev = None |
| 31 | self.sizer = makePageTitle(self, title) |
| 32 | |
| 33 | self.cb = wx.CheckBox(self, -1, "Skip next page") |
| 34 | self.sizer.Add(self.cb, 0, wx.ALL, 5) |
| 35 | |
| 36 | def SetNext(self, next): |
| 37 | self.next = next |
| 38 | |
| 39 | def SetPrev(self, prev): |
| 40 | self.prev = prev |
| 41 | |
| 42 | |
| 43 | # Classes derived from wxPyWizardPanel must override |
| 44 | # GetNext and GetPrev, and may also override GetBitmap |
| 45 | # as well as all those methods overridable by |
| 46 | # wx.PyWindow. |
| 47 | |
| 48 | def GetNext(self): |
| 49 | """If the checkbox is set then return the next page's next page""" |
| 50 | next = self.next |
| 51 | if self.cb.GetValue(): |
| 52 | next = next.GetNext() |
| 53 | return next |
| 54 | |
| 55 | def GetPrev(self): |
| 56 | return self.prev |
| 57 | |
| 58 | #---------------------------------------------------------------------- |
| 59 | |
| 60 | class UseAltBitmapPage(wiz.PyWizardPage): |
| 61 | def __init__(self, parent, title): |
| 62 | wiz.PyWizardPage.__init__(self, parent) |
| 63 | self.next = self.prev = None |
| 64 | self.sizer = makePageTitle(self, title) |
| 65 | |
| 66 | self.sizer.Add(wx.StaticText(self, -1, "This page uses a different bitmap"), |
| 67 | 0, wx.ALL, 5) |
| 68 | |
| 69 | def SetNext(self, next): |
| 70 | self.next = next |
| 71 | |
| 72 | def SetPrev(self, prev): |
| 73 | self.prev = prev |
| 74 | |
| 75 | def GetNext(self): |
| 76 | return self.next |
| 77 | |
| 78 | def GetPrev(self): |
| 79 | return self.prev |
| 80 | |
| 81 | def GetBitmap(self): |
| 82 | # You usually wouldn't need to override this method |
| 83 | # since you can set a non-default bitmap in the |
| 84 | # wxWizardPageSimple constructor, but if you need to |
| 85 | # dynamically change the bitmap based on the |
| 86 | # contents of the wizard, or need to also change the |
| 87 | # next/prev order then it can be done by overriding |
| 88 | # GetBitmap. |
| 89 | return images.getWizTest2Bitmap() |
| 90 | |
| 91 | #---------------------------------------------------------------------- |
| 92 | |
| 93 | class TestPanel(wx.Panel): |
| 94 | def __init__(self, parent, log): |
| 95 | self.log = log |
| 96 | wx.Panel.__init__(self, parent, -1) |
| 97 | |
| 98 | b = wx.Button(self, -1, "Run Simple Wizard", pos=(50, 50)) |
| 99 | self.Bind(wx.EVT_BUTTON, self.OnRunSimpleWizard, b) |
| 100 | |
| 101 | b = wx.Button(self, -1, "Run Dynamic Wizard", pos=(50, 100)) |
| 102 | self.Bind(wx.EVT_BUTTON, self.OnRunDynamicWizard, b) |
| 103 | |
| 104 | self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnWizPageChanged) |
| 105 | self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnWizPageChanging) |
| 106 | self.Bind(wiz.EVT_WIZARD_CANCEL, self.OnWizCancel) |
| 107 | |
| 108 | |
| 109 | def OnWizPageChanged(self, evt): |
| 110 | if evt.GetDirection(): |
| 111 | dir = "forward" |
| 112 | else: |
| 113 | dir = "backward" |
| 114 | |
| 115 | page = evt.GetPage() |
| 116 | self.log.write("OnWizPageChanged: %s, %s\n" % (dir, page.__class__)) |
| 117 | |
| 118 | |
| 119 | def OnWizPageChanging(self, evt): |
| 120 | if evt.GetDirection(): |
| 121 | dir = "forward" |
| 122 | else: |
| 123 | dir = "backward" |
| 124 | |
| 125 | page = evt.GetPage() |
| 126 | self.log.write("OnWizPageChanging: %s, %s\n" % (dir, page.__class__)) |
| 127 | |
| 128 | |
| 129 | def OnWizCancel(self, evt): |
| 130 | page = evt.GetPage() |
| 131 | self.log.write("OnWizCancel: %s\n" % page.__class__) |
| 132 | |
| 133 | # Show how to prevent cancelling of the wizard. The |
| 134 | # other events can be Veto'd too. |
| 135 | if page is self.page1: |
| 136 | wx.MessageBox("Cancelling on the first page has been prevented.", "Sorry") |
| 137 | evt.Veto() |
| 138 | |
| 139 | |
| 140 | def OnWizFinished(self, evt): |
| 141 | self.log.write("OnWizFinished\n") |
| 142 | |
| 143 | |
| 144 | def OnRunSimpleWizard(self, evt): |
| 145 | # Create the wizard and the pages |
| 146 | wizard = wiz.Wizard(self, -1, "Simple Wizard", images.getWizTest1Bitmap()) |
| 147 | page1 = TitledPage(wizard, "Page 1") |
| 148 | page2 = TitledPage(wizard, "Page 2") |
| 149 | page3 = TitledPage(wizard, "Page 3") |
| 150 | page4 = TitledPage(wizard, "Page 4") |
| 151 | self.page1 = page1 |
| 152 | |
| 153 | page1.sizer.Add(wx.StaticText(page1, -1, """ |
| 154 | This wizard is totally useless, but is meant to show how to |
| 155 | chain simple wizard pages together in a non-dynamic manner. |
| 156 | IOW, the order of the pages never changes, and so the |
| 157 | wxWizardPageSimple class can easily be used for the pages.""")) |
| 158 | wizard.FitToPage(page1) |
| 159 | page4.sizer.Add(wx.StaticText(page4, -1, "\nThis is the last page.")) |
| 160 | |
| 161 | # Use the convenience Chain function to connect the pages |
| 162 | wiz.WizardPageSimple_Chain(page1, page2) |
| 163 | wiz.WizardPageSimple_Chain(page2, page3) |
| 164 | wiz.WizardPageSimple_Chain(page3, page4) |
| 165 | |
| 166 | wizard.GetPageAreaSizer().Add(page1) |
| 167 | if wizard.RunWizard(page1): |
| 168 | wx.MessageBox("Wizard completed successfully", "That's all folks!") |
| 169 | else: |
| 170 | wx.MessageBox("Wizard was cancelled", "That's all folks!") |
| 171 | |
| 172 | |
| 173 | |
| 174 | def OnRunDynamicWizard(self, evt): |
| 175 | # Create the wizard and the pages |
| 176 | #wizard = wx.PreWizard() |
| 177 | #wizard.SetExtraStyle(wx.WIZARD_EX_HELPBUTTON) |
| 178 | #wizard.Create(self, self.ID_wiz, "Simple Wizard", |
| 179 | # images.getWizTest1Bitmap()) |
| 180 | wizard = wiz.Wizard(self, -1, "Dynamic Wizard", images.getWizTest1Bitmap()) |
| 181 | |
| 182 | page1 = TitledPage(wizard, "Page 1") |
| 183 | page2 = SkipNextPage(wizard, "Page 2") |
| 184 | page3 = TitledPage(wizard, "Page 3") |
| 185 | page4 = UseAltBitmapPage(wizard, "Page 4") |
| 186 | page5 = TitledPage(wizard, "Page 5") |
| 187 | self.page1 = page1 |
| 188 | |
| 189 | page1.sizer.Add(wx.StaticText(page1, -1, """ |
| 190 | This wizard shows the ability to choose at runtime the order |
| 191 | of the pages and also which bitmap is shown. |
| 192 | """)) |
| 193 | wizard.FitToPage(page1) |
| 194 | page5.sizer.Add(wx.StaticText(page5, -1, "\nThis is the last page.")) |
| 195 | |
| 196 | # Set the initial order of the pages |
| 197 | page1.SetNext(page2) |
| 198 | page2.SetPrev(page1) |
| 199 | page2.SetNext(page3) |
| 200 | page3.SetPrev(page2) |
| 201 | page3.SetNext(page4) |
| 202 | page4.SetPrev(page3) |
| 203 | page4.SetNext(page5) |
| 204 | page5.SetPrev(page4) |
| 205 | |
| 206 | |
| 207 | wizard.GetPageAreaSizer().Add(page1) |
| 208 | if wizard.RunWizard(page1): |
| 209 | wx.MessageBox("Wizard completed successfully", "That's all folks!") |
| 210 | else: |
| 211 | wx.MessageBox("Wizard was cancelled", "That's all folks!") |
| 212 | |
| 213 | #---------------------------------------------------------------------- |
| 214 | |
| 215 | def runTest(frame, nb, log): |
| 216 | win = TestPanel(nb, log) |
| 217 | return win |
| 218 | |
| 219 | #---------------------------------------------------------------------- |
| 220 | |
| 221 | |
| 222 | |
| 223 | overview = """<html><body> |
| 224 | <h2><center>wxWizard</center></h2> |
| 225 | |
| 226 | wxWizard is the central class for implementing 'wizard-like' |
| 227 | dialogs. These dialogs are mostly familiar to Windows users and are |
| 228 | nothing else but a sequence of 'pages' each of them displayed inside a |
| 229 | dialog which has the buttons to pass to the next (and previous) pages. |
| 230 | <p> |
| 231 | The wizards are typically used to decompose a complex dialog into |
| 232 | several simple steps and are mainly useful to the novice users, hence |
| 233 | it is important to keep them as simple as possible. |
| 234 | |
| 235 | </body></html> |
| 236 | """ |
| 237 | |
| 238 | |
| 239 | |
| 240 | if __name__ == '__main__': |
| 241 | import sys,os |
| 242 | import run |
| 243 | run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) |
| 244 | |