Альтернативы волшебнику

Я делаю программу, которая идеально соответствует концепции волшебника; пользователь проходит через шаги по созданию персонажа для игры.

Однако я понимаю, что ограничения мастера затрудняют разработку «элегантного» логического потока. Например, поскольку все страницы мастера инициализируются одновременно, я не могу сделать так, чтобы значения, введенные на одной странице, были доступны на следующей. Мне нужно поместить кнопку на каждую страницу, чтобы получить значения с предыдущей страницы, а не просто автоматически заполнять поля.

Я думал об альтернативах использованию мастера. Я думаю, что лучше всего иметь несколько кнопок на одной панели, которые изменяют информацию на другой панели, например. разделительное окно.

Однако я не могу найти в wxPython никакой документации о том, как динамически менять панель. Все, что я нашел до сих пор, действительно довольно статично, отсюда и использование мастера. Даже в книге "wxPython в действии" об этом не упоминается.

Есть ли туториалы по созданию "динамических панелей" или лучшему управлению мастером?


person crystalattice    schedule 22.10.2008    source источник


Ответы (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()
person Toni Ruža    schedule 22.10.2008

Демонстрация wxPython содержит пример «динамического» мастера. Страницы переопределяют GetNext() и GetPrev() для динамического отображения страниц. Это показывает основную технику; вы можете расширить его, чтобы добавлять и удалять страницы, менять страницы на лету и динамически переставлять страницы.

Однако класс мастера — это просто удобство. Вы можете изменить его или создать свою собственную реализацию. Стиль, который кажется популярным в настоящее время, заключается в использовании представления на основе HTML; вы можете эмулировать это с помощью элемента управления wxHtml или элемента управления IEHtmlWindow, если ваше приложение предназначено только для Windows.

person Ryan Ginstrom    schedule 29.10.2008

Вы можете попробовать использовать механизм рабочего процесса, например WFTK. В этом конкретном случае автор проделал некоторую работу над приложениями на основе wx с использованием WFTK и, вероятно, может указать вам примеры.

person ConcernedOfTunbridgeWells    schedule 22.10.2008

Я бы вообще избавился от волшебника. Это самые неприятные вещи, которые я когда-либо использовал.

Проблема, которая требует приложения-мастера, где вы нажимаете «Далее», возможно, является проблемой, когда вы могли бы применить лучший пользовательский интерфейс немного другим способом. Вместо того, чтобы вызывать диалог с раздражающей кнопкой «Далее». Сделай это:

Поднимите страницу. Когда пользователь вставляет информацию на страницу, расширяйте или сокращайте ее в соответствии с вводом. Если вашему приложению необходимо выполнить некоторую обработку для продолжения, и после этого невозможно вернуться, напишите новую страницу или отключите более ранний раздел текущей страницы. Когда вам больше не нужен какой-либо ввод от пользователя или приложение завершено, вы можете отобразить кнопку или включить существующую.

Я не имею в виду, что вы должны реализовать все это в браузере. Создайте просто контейнер с прокруткой, который может содержать кнопки и метки в плоском списке.

Преимущество: пользователь может просто щелкнуть вкладку, и вам предлагается поместить всю обработку в конец заполнения страницы.

person Cheery    schedule 29.10.2008

Следует отметить, что Мастер должен быть интерфейсом для многошаговых, редко выполняемых задач. Мастер используется для того, чтобы провести пользователя через то, что он на самом деле не понимает, потому что он почти никогда этого не делает.

И если некоторые пользователи могут выполнять эту задачу часто, вы хотите предоставить этим опытным пользователям упрощенный интерфейс, чтобы делать то же самое, даже если это менее понятно.

См.: Руководство по взаимодействию с пользователем Windows Vista — основные нарушения

Мастера

Сначала рассмотрите легкие альтернативы, такие как диалоговые окна, панели задач или отдельные страницы. Мастера — это тяжелый пользовательский интерфейс, который лучше всего использовать для многоэтапных, редко выполняемых задач. Вам не нужно использовать мастера — вы можете предоставить полезную информацию и помощь в любом пользовательском интерфейсе.

person Ian Boyd    schedule 29.10.2008