wxPython - 创建向导,可根据用户选择更改“下一页”页面

时间:2012-09-19 17:33:35

标签: python wxpython

我正在尝试使用wxWizard类创建一个简单的安装程序。在第一页(第0页)我想有3个选项

 1. Install (click Next goes to page install1) 
 2. Upgrade (click Next goes to page upgrade1)
 3. Remove (click Next goes to page remove1)

由于我缺乏OOP(以及一般编程)的经验,我无法理解如何创建可以执行此操作的page0对象。

如果我在install1之前创建page0:未定义全局名称“install1” 如果我在page0之前创建install1:超出最大递归深度 如果我在http://xoomer.virgilio.it/infinity77/wxPython/wizard/wx.wizard.html查看课程SkipNextPage:有一个时髦的GetNext()方法也无法理解。

请帮忙!

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)

1 个答案:

答案 0 :(得分:1)

试试这个

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()

这里是完整的代码...将其命名为wiz.py并运行它

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)