3

ウィザードのコンセプトにぴったり合うプログラムを作っています。ユーザーは、ゲームのキャラクターを作成するための手順を順を追って説明されます。

ただし、ウィザードの制限により、「エレガントな」ロジック フローを設計することが難しくなっていることに気付きました。たとえば、ウィザードのすべてのページが同時に初期化されるため、あるページに入力された値を次のページで使用することはできません。単純にフィールドに自動入力するのではなく、前のページから値を取得するボタンを各ページに配置する必要があります。

ウィザードを使用する代わりの方法を考えました。最良のアイデアは、分割ウィンドウなど、別のパネルの情報を変更するボタンを 1 つのパネルに配置することだと思います。

ただし、パネルを動的に変更する方法については、wxPython のドキュメントが見つかりません。これまでに見つけたものはすべて非常に静的であるため、ウィザードを使用しています。「wxPython in Action」の本でさえ、それについて言及していません。

「動的パネル」を作成したり、ウィザードをより適切に管理したりするためのチュートリアルはありますか?

4

5 に答える 5

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()
于 2008-10-22T08:04:52.057 に答える
1

wxPython デモには、「動的」ウィザードの例があります。ページは GetNext() と GetPrev() をオーバーライドして、ページを動的に表示します。これは基本的なテクニックを示しています。ページを追加および削除したり、その場でページを変更したり、ページを動的に再配置したりするように拡張できます。

ただし、ウィザード クラスは便利なだけです。これを変更するか、独自の実装を作成できます。最近人気があると思われるスタイルは、HTML ベースのプレゼンテーションを使用することです。これは wxHtml コントロールでエミュレートできます。アプリが Windows のみの場合は IEHtmlWindow コントロールでエミュレートできます。

于 2008-10-29T16:09:32.753 に答える
0

ウィザードは、マルチステップで実行頻度の低いタスクのインターフェイスである必要があることに注意してください。ウィザードは、ユーザーがほとんど理解していないことをユーザーに案内するために使用されます。

また、一部のユーザーが頻繁にタスクを実行する可能性がある場合は、それらのパワーユーザーに、同じことを実行するための軽量のインターフェイスを提供する必要があります。

参照:WindowsVistaユーザーエクスペリエンスガイドライン-主な違反

ウィザード

最初に、ダイアログボックス、作業ウィンドウ、単一ページなどの軽量の代替案を検討してください。ウィザードは重いUIであり、マルチステップで実行頻度の低いタスクに最適です。ウィザードを使用する必要はありません。どのUIでも役立つ情報と支援を提供できます。

于 2008-10-29T17:38:48.610 に答える
0

WFTKなどのワークフロー エンジンを使用してみてください。この特定のケースでは、作成者は WFTK を使用して wx ベースのアプリでいくつかの作業を行っており、おそらく例を示すことができます。

于 2008-10-22T12:06:03.987 に答える
0

私はウィザードを完全に取り除きます。それらは私が今まで使った中で最も不快なものです。

「次へ」をクリックするウィザード アプリケーションを必要とする問題は、おそらく、少し異なる方法でより優れたユーザー インターフェイスを適用できる問題です。迷惑な「次へ」ボタンでダイアログを表示する代わりに。これを行う:

ページを表示します。ユーザーがページに情報を挿入すると、入力に応じて情報が拡張または短縮されます。アプリケーションが続行するために何らかの処理を行う必要があり、その後元に戻すことができない場合は、新しいページを書き込むか、現在のページの前のセクションを無効にします。ユーザーからの入力が不要になった場合、またはアプリが終了した場合は、ボタンを表示するか、既存のボタンを有効にすることができます。

すべてをブラウザに実装する必要があるという意味ではありません。フラットなリストにボタンとラベルを含めることができる単純なスクロール コンテナーを作成します。

利点: ユーザーはタブをクリックするだけで済み、すべての処理をページへの入力の最後に行うことが推奨されます。

于 2008-10-29T17:14:33.433 に答える