9.3 创建向导
向导是一系列被链接在一起的简单对话框,它使得用户一步步地跟随它们。通常它们被用于指导用户的安装或一个复杂的配置过程。图9.11显示了一个向导示例。
图9.11
在wxPython 中,一个向导是一系列的页面,它由类wx.wizard.Wizard的一个实例控制。向导实例管理用户的页面切换事件。这些页面自身也是类 wx.wizard.WizardPageSimple或wx.wizard.WizardPage的实例。这两种类的实例,它们只不过是附加了必要的管 理页面链接逻辑的wx.Panel的实例。已证明这两个实例之间的区别仅当用户按下Next按钮时。wx.wizard.WizardPage的实例使你 能够动态地决定浏览哪页,而wx.wizard.WizardPageSimple的实例要求向导被显示前,顺序被预先设置。例9.11显示了产生图 9.11的代码。
例9.11 创建一个简单的静态向导
import wx
import wx.wizard
class TitledPage(wx.wizard.WizardPageSimple):#1 创建页面样板
def __init__(self, parent, title):
wx.wizard.WizardPageSimple.__init__(self, parent)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(self.sizer)
titleText = wx.StaticText(self, -1, title)
titleText.SetFont(
wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD))
self.sizer.Add(titleText, 0,
wx.ALIGN_CENTRE | wx.ALL, 5)
self.sizer.Add(wx.StaticLine(self, -1), 0,
wx.EXPAND | wx.ALL, 5)
if __name__ == "__main__":
app = wx.PySimpleApp()
wizard = wx.wizard.Wizard(None, -1, "Simple Wizard")# 创建向导实例
# 创建向导页面
page1 = TitledPage(wizard, "Page 1")
page2 = TitledPage(wizard, "Page 2")
page3 = TitledPage(wizard, "Page 3")
page4 = TitledPage(wizard, "Page 4")
page1.sizer.Add(wx.StaticText(page1, -1,
"Testing the wizard"))
page4.sizer.Add(wx.StaticText(page4, -1,
"This is the last page."))
#2 创建页面链接
wx.wizard.WizardPageSimple_Chain(page1, page2)
wx.wizard.WizardPageSimple_Chain(page2, page3)
wx.wizard.WizardPageSimple_Chain(page3, page4)
wizard.FitToPage(page1)#3 调整向导的尺寸
if wizard.RunWizard(page1):#4 运行向导
print "Success"
wizard.Destroy()
#1 为了便于移植的目的,我们创建了一个简单的小的页面,它包含了一个静态文本标题。通常情况下,这儿还包含一些表单元素,可能还有一些要用户输入的数据。
#2 wx.wizard.WizardPageSimple_Chain()函数是一个便利的方法,它以两个页面为参数相互地调用它们的SetNext()和SetPrev()方法。
#3 FitToSize()根据页面参数及该页链条上的所有页面调整向导的大小。该方法只能在页面链接被创建后调用。
#4 该方法的参数是向导开始时的页面。向导在它到达一个没有下一页的页面时知道去关闭。如果用户浏览了整个向导并通过按下Finish按钮退出的话,RunWizard()方法返回True。
创建wx.wizard.Wizard实例是使用向导的第一步。其构造函数如下:
wx.wizard.Wizard(parent, id=-1, title=wx.EmptyString,
bitmap=wx.NullBitmap, pos=wx.DefaultPosition)
在 这里的parent, id, title, pos和wx.Panel的意义相同。如果设置了bitmap参数,那么该参数将显示在每一页上。这儿只有 一个样式标记:wx.wizard.WIZARD_EX_HELPBUTTON,它显示一个帮助按钮。这是一个扩展的标记,需要使用第8章所说的两步创建 过程。
通常,你将调用例9.11的#3中所示的FitToSize()来管理窗口的尺寸,但是你也可以通过调用带有一个元组或 wx.Size实例的SetPageSize()来设置一个最小的尺寸。GetPageSize()方法返回当前的尺寸,在这两种情况下,该尺寸仅用于对 话框中的单个的页面部分,而作为一个整体的对话框将更大一些。
你可以管理该类中的页面。方法GetCurrentPage()返回当前被显示的页面,如果该向导当前没有被显示,该方法返回None。你可以通过调用HasNextPage()和HasPrevPage()来确定当前页是否有下一页或上一页。
使用RunWizard()来运行该向导,如例9.11中#4的说明。
向 导产生的命令事件如表9.5所示,你可以捕获这些事件,以便作专门的处理。这些事件对象属于类wx.wizard.WizardEvent,它们提供了两 个可用的方法。GetPage()返回wx.WizardPage的实例,该实例在向导事件产生时是有效,而非作为事件结果被显示的实例。如果事件是前进 一页,那么GetDirection()返回True,如果事件是后退一页,那么GetDirection()返回False。
表9.5 wx.wizard.WizardDialog的事件
EVT_WIZARD_CANCEL:当用户按下Cancel按钮时产生。该事件可以使用Veto()来否决,这种情况下,对话框将不会消失。
EVT_WIZARD_FINISHED :当用户按下Finish按钮时产生。
EVT_WIZARD_HELP:当用户按下Help按钮时产生。
EVT_WIZARD_PAGE_CHANGED:在页面被切换后产生。
EVT_WIZARD_PAGE_CHANGING:当用户已请求了一个页面切换时产生,这时页面还没有发生切换。这个事件可以被否决(例如,如果页面上有一个必须被填写的字段)。
wx.wizard.WizardPageSimple类被当作一个面板一样。它的构造函数使你可以设置上一页和下一页,如下所示:
wx.wizard.WizardPageSimple(parent=None, prev=None, next=None)
如果你想在构造器中设置它们,你可以使用SetPrev()和SetNext()方法。如果那样太麻烦,你可以使用wx.wizard.WizardPageSimple_Chain(),它设置两页间的链接关系。
向导页的复杂版:wx.wizard.WizardPage,稍微不同。它没有显式地设置前一页和下一页,而是使你能够使用更复杂的逻辑去定义下一步到哪儿。它的构造函数如下:
wx.WizardPage(parent, bitmap=wx.NullBitmap, resource=None)
如 果bitmap参数被设置了,那么该参数覆盖父向导中所设置的位图。resource参数从一个wxPython资源装载页面。要处理页面逻辑,就要覆盖 GetPrev()和GetNext()方法来返回你想要向导下一步的位置。该类的一个典型的用法是根据用户对当前页的响应动态地决定接下来的页面。
向导是一系列被链接在一起的简单对话框,它使得用户一步步地跟随它们。通常它们被用于指导用户的安装或一个复杂的配置过程。图9.11显示了一个向导示例。
图9.11
![](https://i-blog.csdnimg.cn/blog_migrate/af17f025f82f93c7855d11fdc82ff643.png)
在wxPython 中,一个向导是一系列的页面,它由类wx.wizard.Wizard的一个实例控制。向导实例管理用户的页面切换事件。这些页面自身也是类 wx.wizard.WizardPageSimple或wx.wizard.WizardPage的实例。这两种类的实例,它们只不过是附加了必要的管 理页面链接逻辑的wx.Panel的实例。已证明这两个实例之间的区别仅当用户按下Next按钮时。wx.wizard.WizardPage的实例使你 能够动态地决定浏览哪页,而wx.wizard.WizardPageSimple的实例要求向导被显示前,顺序被预先设置。例9.11显示了产生图 9.11的代码。
例9.11 创建一个简单的静态向导
import wx
import wx.wizard
class TitledPage(wx.wizard.WizardPageSimple):#1 创建页面样板
def __init__(self, parent, title):
wx.wizard.WizardPageSimple.__init__(self, parent)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(self.sizer)
titleText = wx.StaticText(self, -1, title)
titleText.SetFont(
wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD))
self.sizer.Add(titleText, 0,
wx.ALIGN_CENTRE | wx.ALL, 5)
self.sizer.Add(wx.StaticLine(self, -1), 0,
wx.EXPAND | wx.ALL, 5)
if __name__ == "__main__":
app = wx.PySimpleApp()
wizard = wx.wizard.Wizard(None, -1, "Simple Wizard")# 创建向导实例
# 创建向导页面
page1 = TitledPage(wizard, "Page 1")
page2 = TitledPage(wizard, "Page 2")
page3 = TitledPage(wizard, "Page 3")
page4 = TitledPage(wizard, "Page 4")
page1.sizer.Add(wx.StaticText(page1, -1,
"Testing the wizard"))
page4.sizer.Add(wx.StaticText(page4, -1,
"This is the last page."))
#2 创建页面链接
wx.wizard.WizardPageSimple_Chain(page1, page2)
wx.wizard.WizardPageSimple_Chain(page2, page3)
wx.wizard.WizardPageSimple_Chain(page3, page4)
wizard.FitToPage(page1)#3 调整向导的尺寸
if wizard.RunWizard(page1):#4 运行向导
print "Success"
wizard.Destroy()
#1 为了便于移植的目的,我们创建了一个简单的小的页面,它包含了一个静态文本标题。通常情况下,这儿还包含一些表单元素,可能还有一些要用户输入的数据。
#2 wx.wizard.WizardPageSimple_Chain()函数是一个便利的方法,它以两个页面为参数相互地调用它们的SetNext()和SetPrev()方法。
#3 FitToSize()根据页面参数及该页链条上的所有页面调整向导的大小。该方法只能在页面链接被创建后调用。
#4 该方法的参数是向导开始时的页面。向导在它到达一个没有下一页的页面时知道去关闭。如果用户浏览了整个向导并通过按下Finish按钮退出的话,RunWizard()方法返回True。
创建wx.wizard.Wizard实例是使用向导的第一步。其构造函数如下:
wx.wizard.Wizard(parent, id=-1, title=wx.EmptyString,
bitmap=wx.NullBitmap, pos=wx.DefaultPosition)
在 这里的parent, id, title, pos和wx.Panel的意义相同。如果设置了bitmap参数,那么该参数将显示在每一页上。这儿只有 一个样式标记:wx.wizard.WIZARD_EX_HELPBUTTON,它显示一个帮助按钮。这是一个扩展的标记,需要使用第8章所说的两步创建 过程。
通常,你将调用例9.11的#3中所示的FitToSize()来管理窗口的尺寸,但是你也可以通过调用带有一个元组或 wx.Size实例的SetPageSize()来设置一个最小的尺寸。GetPageSize()方法返回当前的尺寸,在这两种情况下,该尺寸仅用于对 话框中的单个的页面部分,而作为一个整体的对话框将更大一些。
你可以管理该类中的页面。方法GetCurrentPage()返回当前被显示的页面,如果该向导当前没有被显示,该方法返回None。你可以通过调用HasNextPage()和HasPrevPage()来确定当前页是否有下一页或上一页。
使用RunWizard()来运行该向导,如例9.11中#4的说明。
向 导产生的命令事件如表9.5所示,你可以捕获这些事件,以便作专门的处理。这些事件对象属于类wx.wizard.WizardEvent,它们提供了两 个可用的方法。GetPage()返回wx.WizardPage的实例,该实例在向导事件产生时是有效,而非作为事件结果被显示的实例。如果事件是前进 一页,那么GetDirection()返回True,如果事件是后退一页,那么GetDirection()返回False。
表9.5 wx.wizard.WizardDialog的事件
EVT_WIZARD_CANCEL:当用户按下Cancel按钮时产生。该事件可以使用Veto()来否决,这种情况下,对话框将不会消失。
EVT_WIZARD_FINISHED :当用户按下Finish按钮时产生。
EVT_WIZARD_HELP:当用户按下Help按钮时产生。
EVT_WIZARD_PAGE_CHANGED:在页面被切换后产生。
EVT_WIZARD_PAGE_CHANGING:当用户已请求了一个页面切换时产生,这时页面还没有发生切换。这个事件可以被否决(例如,如果页面上有一个必须被填写的字段)。
wx.wizard.WizardPageSimple类被当作一个面板一样。它的构造函数使你可以设置上一页和下一页,如下所示:
wx.wizard.WizardPageSimple(parent=None, prev=None, next=None)
如果你想在构造器中设置它们,你可以使用SetPrev()和SetNext()方法。如果那样太麻烦,你可以使用wx.wizard.WizardPageSimple_Chain(),它设置两页间的链接关系。
向导页的复杂版:wx.wizard.WizardPage,稍微不同。它没有显式地设置前一页和下一页,而是使你能够使用更复杂的逻辑去定义下一步到哪儿。它的构造函数如下:
wx.WizardPage(parent, bitmap=wx.NullBitmap, resource=None)
如 果bitmap参数被设置了,那么该参数覆盖父向导中所设置的位图。resource参数从一个wxPython资源装载页面。要处理页面逻辑,就要覆盖 GetPrev()和GetNext()方法来返回你想要向导下一步的位置。该类的一个典型的用法是根据用户对当前页的响应动态地决定接下来的页面。