一个向导的替代方案

问题描述:

我正在制作一个适合向导理念的程序,用户通过步骤来创建游戏角色。一个向导的替代方案

但是,我意识到向导的局限性使得设计“优雅”的逻辑流程变得困难。例如,因为向导的所有页面都在同一时间初始化,所以我无法将一个页面中输入的值输入到下一个页面。我必须在每个页面上放置一个按钮才能从前一页获取值,而不仅仅是自动填充字段。

我想过使用向导的替代方案。我认为最好的想法是在一个面板上有一些按钮来改变另一个面板上的信息,例如,一个分离器窗口。

但是,我无法在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() 

您可以尝试使用工作流引擎,如WFTK。在这个特定的案例中,作者已经在使用WFTK的基于wx的应用程序上做了一些工作,并且可能会引导您参考示例。

wxPython演示有一个“动态”向导的例子。页面覆盖GetNext()和GetPrev()以动态显示页面。这显示了基本的技术;您可以扩展它以添加和删除页面,动态更改页面并动态重新排列页面。

虽然,向导类只是一个方便。你可以修改它,或者创建你自己的实现。现在流行的风格是使用基于HTML的演示文稿;您可以使用wxHtml控件或IEHtmlWindow控件来模拟此功能(如果您的应用程序仅适用于Windows)。

我会摆脱整个巫师。他们是我曾经使用过的最不愉快的东西。

需要单击“下一步”的向导应用程序的问题可能是您可以以不同的方式应用更好的用户界面的问题。而不是用烦人的“下一个”按钮提出对话。这样做:

调出一个页面。当用户将信息插入页面时,根据输入进行扩展或缩短。如果您的应用程序需要执行一些处理才能继续,并且在此之后无法恢复,请编写新页面或禁用当前页面的前一部分。如果您不再需要用户的任何输入或应用程序已完成,则可以显示按钮或启用现有的按钮。

我不是说你应该在浏览器中实现它。只需制作一个滚动容器,即可在平面列表中包含按钮和标签。

优点:用户只需点击一个标签,并鼓励您将所有处理过程放入填充页面的最后。

应该注意的是,向导应该是多步骤,不经常执行的任务的接口。该向导用于指导用户完成他们不太了解的事情,因为他们几乎从不这样做。

如果有些用户可能频繁地执行此任务,那么您希望为这些高级用户提供一个轻量级界面来执行相同的操作 - 即使它不那么自我解释。

参见:Windows Vista User Experience Guidelines - Top Violations

奇才

首先考虑轻量级替代品,如对话框,任务窗格 或单页。奇才是 沉重的用户界面,最好用于多步骤, 不常执行的任务。你不需要 必须使用向导 - 你可以提供 有用的信息和帮助在 任何用户界面。