Альтернативы волшебнику - PullRequest
3 голосов
/ 22 октября 2008

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

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

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

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

Существуют ли учебники по созданию "динамических панелей" или более эффективному управлению мастером?

Ответы [ 5 ]

5 голосов
/ 22 октября 2008

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

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 голос
/ 29 октября 2008

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

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

0 голосов
/ 29 октября 2008

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

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

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

Wizards

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

0 голосов
/ 29 октября 2008

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

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

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

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

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

0 голосов
/ 22 октября 2008

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

...