Reputation: 300
I am trying to create a simple installer using the wxWizard class. On the first page (page0) I would like to have 3 options
1. Install (click Next goes to page install1)
2. Upgrade (click Next goes to page upgrade1)
3. Remove (click Next goes to page remove1)
Due to my lack of experience with OOP (and programming in general), I'm unable to understand how to create the page0 object that would do this.
If I create page0 before install1: global name 'install1' is not defined
If I create install1 before page0: maximum recursion depth exceeded
If I look at class SkipNextPage at http://xoomer.virgilio.it/infinity77/wxPython/wizard/wx.wizard.html: there is a funky GetNext()
method that also don't understand.
Please help!
import wx
import wx.wizard
class InstallPage_Dyn(wx.wizard.PyWizardPage):
def __init__(self, parent, title):
wx.wizard.PyWizardPage.__init__(self, parent)
self.next = self.prev = None
class InstallPage0(wx.wizard.PyWizardPage):
def __init__(self, parent, title):
wx.wizard.PyWizardPage.__init__(self, parent)
self.next = self.prev = None
self.box = wx.RadioBox (self, -1, 'Choose one of the options below and hit Next\n', choices=['Install','Upgrade','Remove'], style = wx.VERTICAL | wx.EXPAND)
# Set Next button based on user choice
self.box.Bind(wx.EVT_RADIOBOX, self.SetNext(install1))
# Setter and getter methods to specify Next and Previous buttons#
def SetNext(self, next):
userchoice = self.box.GetSelection()
if userchoice == 0:
self.SetNext(install1)
elif userchoice == 1:
self.SetNext(upgrade1)
elif userchoice == 2:
self.SetNext(remove1)
def SetPrev(self, prev):
return self.prev
def GetNext(self):
return self.next
def GetPrev(self):
return self.prev
# Define application and create the wizard
app = wx.App()
wizard = wx.wizard.Wizard(None, -1, "Installer")
wizard.SetPageSize((500,350))
# User selected install. Create the pages
install1 = InstallPage_Dyn(wizard, "Install")
upgrade1 = InstallPage_Dyn(wizard, "Upgrade")
remove1 = InstallPage_Dyn(wizard, "Remove")
# Create page instances
page0 = InstallPage0(wizard, "Installer")
wizard.RunWizard(page0)
Upvotes: 2
Views: 1342
Reputation: 114038
Try this
class InstallPage_Dyn(wx.wizard.PyWizardPage):
def __init__(self, parent, title):
wx.wizard.PyWizardPage.__init__(self, parent)
self.title = wx.StaticText(self,-1,title)
self.title.SetFont(wx.Font(40,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD))
self.next = self.prev = None
def SetPrev(self,prev):
self.prev = prev
def GetPrev(self):
return self.prev
class InstallPage0(wx.wizard.PyWizardPage):
def __init__(self, parent, title,optional_panels = {}):
wx.wizard.PyWizardPage.__init__(self, parent)
self.prev = self
self.next = optional_panels.values()[0]
self.box = wx.RadioBox (self, -1, 'Choose one of the options below and hit Next\n', choices=optional_panels.keys(), style = wx.VERTICAL | wx.EXPAND)
self.opts = optional_panels.keys()
self.pages = optional_panels.values()
for p in self.pages:
p.SetPrev(self)
self.next = self.pages[0]
self.optional_panels = optional_panels
def GetNext(self):
return self.pages[self.box.GetSelection()]
def GetPrev(self):
return self.prev
...
page0 = InstallPage0(wizard, "Installer",{'install':install1,'upgrade':upgrade1,'remove':remove1})
wizard.RunWizard(page0)
#app.MainLoop()
here is the full code ... name it wiz.py
and run it
import wx
import wx.wizard
class InstallPage_Dyn(wx.wizard.PyWizardPage):
def __init__(self, parent, title):
wx.wizard.PyWizardPage.__init__(self, parent)
self._title = title
self.title = wx.StaticText(self,-1,title)
self.title.SetFont(wx.Font(40,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD))
self.next = self.prev = None
def SetPrev(self,prev):
self.prev = prev
def GetPrev(self):
return self.prev
class InstallPage0(wx.wizard.PyWizardPage):
def __init__(self, parent, title,optional_panels = {}):
wx.wizard.PyWizardPage.__init__(self, parent)
self.prev = self
self.next = optional_panels[0]
options = [p._title for p in optional_panels]
self.box = wx.RadioBox (self, -1, 'Choose one of the options below and hit Next\n', choices=options, style = wx.VERTICAL | wx.EXPAND)
self.pages = optional_panels
for p in self.pages:
p.SetPrev(self)
self.next = install1
self.optional_panels = optional_panels
def SetPrev(self, prev):
self.prev = prev
return self.prev
def GetNext(self):
return self.pages[self.box.GetSelection()]
def GetPrev(self):
return self.prev
# Define application and create the wizard
app = wx.App(redirect=False)
wizard = wx.wizard.Wizard(None, -1, "Installer")
wizard.SetPageSize((500,350))
# User selected install. Create the pages
install1 = InstallPage_Dyn(wizard, "Install")
upgrade1 = InstallPage_Dyn(wizard, "Upgrade")
remove1 = InstallPage_Dyn(wizard, "Remove")
# Create page instances
page0 = InstallPage0(wizard, "Installer",[install1,upgrade1,remove1])
wizard.RunWizard(page0)
Upvotes: 1