문제

나는 마법사 개념에 이상적으로 맞는 프로그램을 만들고 있습니다. 사용자는 게임의 캐릭터를 만들기 위해 단계를 진행합니다.

그러나 마법사의 한계가 "우아한"논리 흐름을 설계하기가 어렵다는 것을 알고 있습니다. 예를 들어, 마법사의 모든 페이지가 동시에 비정상적이므로 다음 페이지에 값을 입력 할 수 없습니다. 단순히 필드를 자동으로 인구를 갖는 대신 이전 페이지에서 값을 가져 오려면 각 페이지에 버튼을 넣어야합니다.

마법사 사용에 대한 대안에 대해 생각했습니다. 가장 좋은 아이디어는 하나의 패널에 다른 패널의 정보를 변경하는 버튼이있는 것 (예 : 스플리터 창)을 갖는 것입니다.

그러나 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()

다른 팁

WXPYTHON 데모에는 "동적"마법사의 예가 있습니다. 페이지는 getNext () 및 getPrev ()를 무시하여 페이지를 동적으로 표시합니다. 이것은 기본 기술을 보여줍니다. 페이지를 추가하고 제거하여 페이지를 즉시 변경하고 즉시 페이지를 변경하며 페이지를 동적으로 재 배열 할 수 있습니다.

그러나 마법사 클래스는 편리함입니다. 이를 수정하거나 자신의 구현을 만들 수 있습니다. 오늘날 인기있는 스타일은 HTML 기반 프레젠테이션을 사용하는 것입니다. 앱이 Windows 전용 인 경우 WXHTML 컨트롤 또는 IEHTMLWindow 컨트롤로이를 모방 할 수 있습니다.

워크 플로 엔진을 사용해 볼 수 있습니다 wftk. 이 특정 사례에서 저자는 WFTK를 사용하여 WX 기반 앱에 대해 일부 작업을 수행했으며 아마도 예제로 안내 할 수 있습니다.

나는 마법사 전체를 제거 할 것입니다. 그들은 내가 사용한 가장 불쾌한 것들입니다.

'다음'을 클릭하는 마법사 신청이 필요한 문제는 아마도 더 나은 사용자 인터페이스를 약간 다른 방식으로 적용 할 수있는 문제 일 것입니다. 성가신 'Next'-Button과 대화를 나누는 대신. 이 작업을 수행:

페이지를 가져 오십시오. 사용자가 페이지에 정보를 삽입하면 입력에 따라 확장하거나 단축하십시오. 애플리케이션이 계속되기 위해 처리를 수행 해야하는 경우, 그 후 되돌릴 수없는 경우 새 페이지를 작성하거나 현재 페이지의 이전 섹션을 비활성화하십시오. 더 이상 사용자의 입력이 필요하지 않거나 앱이 완료되면 버튼을 표시하거나 기존을 활성화 할 수 있습니다.

브라우저에서 모든 것을 구현해야한다는 의미는 아닙니다. 평평한 목록에 버튼과 레이블을 포함 할 수있는 스크롤 컨테이너를 간단히 만듭니다.

혜택 : 사용자는 탭을 클릭 할 수 있으며 모든 처리를 페이지 채우기 끝에 넣는 것이 좋습니다.

마법사는 Mutli-Step, 드물게 성능이 좋은 작업의 인터페이스 여야합니다. 마법사는 거의 이해하지 못하는 것을 통해 사용자를 안내하는 데 사용됩니다.

일부 사용자가 작업을 자주 수행 할 수 있다면 해당 파워 사용자에게 자신이 설명 할 수없는 경우에도 동일한 작업을 수행하기 위해 경량 인터페이스를 제공하려고합니다.

보다: Windows Vista 사용자 경험 가이드 라인 - 최고 위반

마법사

대화 상자, 작업 패널 또는 단일 페이지와 같은 가벼운 대안을 먼저 고려하십시오. 마법사는 무거운 UI로 다단계, 드물게 수행 된 작업에 가장 잘 사용됩니다. 마법사를 사용할 필요는 없습니다. UI에 유용한 정보와 지원을 제공 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top