向导的替代方案

时间:2008-10-22 02:54:18

标签: python wxpython wizard

我正在制作一个理想的适合向导概念的程序;用户完成了为游戏创建角色的步骤。

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

我已经考虑过使用向导的替代方法。我认为最好的想法是在一个面板上设置一些按钮来改变另一个面板上的信息,例如分裂窗口。

但是,我在wxPython中找不到有关如何动态更改面板的任何文档。到目前为止我发现的一切都非常静态,因此使用了向导。即使是“wxPython in Action”一书也没有提到它。

是否有任何教程可以制作“动态面板”或更好地管理向导?

5 个答案:

答案 0 :(得分:5)

这是一个简单的例子。这样,您可以使“向导”像有限状态机一样工作,其中状态是按需初始化的不同页面。此外,数据在页面之间共享。

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

答案 1 :(得分:1)

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

但是向导类只是一种方便。您可以修改它,也可以创建自己的实现。现在看来很流行的一种风格是使用基于HTML的演示文稿;您可以使用wxHtml控件或IEHtmlWindow控件模拟此操作,如果您的应用程序仅限Windows。

答案 2 :(得分:0)

您可以尝试使用WFTK之类的工作流程引擎。在这个特殊情况下,作者使用WFTK对基于wx的应用程序做了一些工作,可能会引导您进行示例。

答案 3 :(得分:0)

我完全摆脱了巫师。它们是我用过的最不愉快的东西。

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

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

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

好处:用户只需单击一个选项卡,我们鼓励您将所有处理放到填充页面的末尾。

答案 4 :(得分:0)

应该注意的是,向导应该是多步骤,不经常执行的任务的接口。该向导用于引导用户完成他们并不真正理解的内容,因为他们几乎从不这样做。

如果某些用户可能经常执行该任务,您希望为这些超级用户提供一个轻量级的界面来执行相同的操作 - 即使它不太自我解释。

请参阅: Windows Vista User Experience Guidelines - Top Violations

  

<强>向导

     

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