我正在制作一个理想的适合向导概念的程序; 用户完成了为游戏创建角色的步骤.
但是,我意识到向导的局限性使得设计"优雅"逻辑流变得困难.例如,因为向导的所有页面都是同时初始化的,所以我不能在一个页面中输入的值可用于下一个页面.我必须在每个页面上放置一个按钮以获取上一页的值,而不是简单地自动填充字段.
我已经考虑过使用向导的替代方案.我认为最好的想法是在一个面板上有一些按钮来改变另一个面板上的信息,例如分割窗口.
但是,我在wxPython中找不到关于如何动态更改面板的任何文档.到目前为止我发现的一切都非常静态,因此使用了向导.即使是"wxPython in Action"一书也没有提到它.
是否有任何教程可以制作"动态面板"或更好地管理向导?
这是一个简单的例子.这样,您可以使"向导"像有限状态机一样工作,其中状态是按需初始化的不同页面.此外,数据在页面之间共享.
import wx import wx.lib.newevent (PageChangeEvent, EVT_PAGE_CHANGE) = wx.lib.newevent.NewEvent() class Data: foo = None bar = None class Page1(wx.Panel): def __init__(self, parent, data): wx.Panel.__init__(self, parent) self.parent = parent self.data = data sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(sizer) label = wx.StaticText(self, label="Page 1 - foo") self.foo = wx.TextCtrl(self) goto_page2 = wx.Button(self, label="Go to page 2") for c in (label, self.foo, goto_page2): sizer.Add(c, 0, wx.TOP, 5) goto_page2.Bind(wx.EVT_BUTTON, self.OnPage2) def OnPage2(self, event): self.data.foo = self.foo.Value wx.PostEvent(self.parent, PageChangeEvent(page=Page2)) class Page2(wx.Panel): def __init__(self, parent, data): wx.Panel.__init__(self, parent) self.parent = parent self.data = data sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(sizer) label = wx.StaticText(self, label="Page 2 - bar") self.bar = wx.TextCtrl(self) goto_finish = wx.Button(self, label="Finish") for c in (label, self.bar, goto_finish): sizer.Add(c, 0, wx.TOP, 5) goto_finish.Bind(wx.EVT_BUTTON, self.OnFinish) def OnFinish(self, event): self.data.bar = self.bar.Value wx.PostEvent(self.parent, PageChangeEvent(page=finish)) def finish(parent, data): wx.MessageBox("foo = %s\nbar = %s" % (data.foo, data.bar)) wx.GetApp().ExitMainLoop() class Test(wx.Frame): def __init__(self): wx.Frame.__init__(self, None) self.data = Data() self.current_page = None self.Bind(EVT_PAGE_CHANGE, self.OnPageChange) wx.PostEvent(self, PageChangeEvent(page=Page1)) def OnPageChange(self, event): page = event.page(self, self.data) if page == None: return if self.current_page: self.current_page.Destroy() self.current_page = page page.Layout() page.Fit() page.Refresh() app = wx.PySimpleApp() app.TopWindow = Test() app.TopWindow.Show() app.MainLoop()