2008-10-22 3 views
3

마법사 개념에 이상적으로 맞는 프로그램을 만들고 있습니다. 사용자는 게임을위한 캐릭터를 생성하기위한 단계들을 거치게된다.마법사의 대안

그러나 마법사의 한계로 인해 "우아한"논리 흐름을 설계하는 것이 어렵다는 것을 알고 있습니다. 예를 들어, 마법사의 모든 페이지가 동시에 초기화되므로 한 페이지에 입력 된 값을 다음 페이지에서 사용할 수 없습니다. 필드를 자동으로 채우는 것보다는 이전 페이지에서 값을 가져 오기 위해 각 페이지에 버튼을 추가해야합니다.

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

그러나 동적으로 패널을 변경하는 방법에 대한 wxPython의 설명서를 찾을 수 없습니다. 지금까지 내가 찾은 모든 것은 꽤 정적이어서 마법사를 사용합니다. 심지어 "wxPython in Action"서적에도 언급되지 않았습니다.

마법사의 "동적 패널"또는 더 나은 관리를위한 자습서가 있습니까?

답변

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

WFTK과 같은 워크 플로 엔진을 사용해 볼 수 있습니다. 이 특별한 경우 저자는 WFTK를 사용하여 wx 기반 응용 프로그램에 대한 작업을 수행했으며 예제로 안내 할 수 있습니다.

1

wxPython 데모에는 "동적"마법사의 예제가 있습니다. 페이지는 GetNext() 및 GetPrev()를 재정 의하여 페이지를 동적으로 표시합니다. 이것은 기본 기술을 보여줍니다. 페이지를 추가 및 제거하고, 즉시 페이지를 변경하고, 페이지를 동적으로 재배치하기 위해 페이지를 확장 할 수 있습니다.

마법사 클래스는 편리합니다. 이를 수정하거나 직접 구현할 수 있습니다. 요즘 인기있는 스타일은 HTML 기반 프레젠테이션을 사용하는 것입니다. 앱이 Windows 전용 인 경우 wxHtml 컨트롤 또는 IEHtmlWindow 컨트롤을 사용하여이를 에뮬레이트 할 수 있습니다.

0

전체적으로 마법사를 없애 버릴 수 있습니다. 그것들은 내가 사용 해본 가장 불쾌한 것들이다.

마법사 응용 프로그램에서 '다음'을 클릭해야하는 문제는 조금 다른 방식으로 더 나은 사용자 인터페이스를 적용 할 수있는 문제 일 수 있습니다. 성가신 '다음'버튼으로 대화 상자를 불러오는 대신. 다음을 수행하십시오 :

페이지를 불러 오십시오. 사용자가 페이지에 정보를 삽입하면 입력에 따라 정보를 확장하거나 축소 할 수 있습니다. 응용 프로그램이 계속 진행하기 위해 일부 처리를해야하고 그 후에 되돌릴 수없는 경우 새 페이지를 작성하거나 현재 페이지의 이전 섹션을 비활성화하십시오. 사용자가 더 이상 입력 할 필요가 없거나 앱이 끝나면 버튼을 표시하거나 기존 버튼을 사용하도록 설정할 수 있습니다.

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

이점 : 사용자는 탭을 클릭하기 만하면 페이지 처리가 끝날 때까지 모든 처리를 진행하는 것이 좋습니다.

0

마법사는 자주 수행되지 않는 여러 단계의 작업을위한 인터페이스 여야합니다.마법사는 거의 이해할 수 없기 때문에 실제로 이해하지 못하는 것을 통해 사용자를 안내하는 데 사용됩니다.

일부 사용자가 작업을 자주 수행 할 수있는 경우, 파워 유저에게 동일한 작업을 수행 할 수있는 간단한 인터페이스를 제공하고자합니다.

참조 : Windows Vista User Experience Guidelines - Top Violations

마법사

는 대화 상자, 작업 창, 또는 단일 페이지와 같은 최초의 경량 대안을 생각해 보자. 마법사는 무거운 UI, 다단계에 가장 많이 사용되며 드물게 수행되는 작업입니다. 마법사를 사용하지 않아도됩니다. UI를 입력하면 에게 도움이 될 것입니다.