Pergunta

Eu estou fazendo um programa que se encaixa o conceito assistente idealmente; o usuário é orientado as etapas para criar um personagem para um jogo.

No entanto, estou percebendo que as limitações do assistente são o que torna difícil projetar fluxo lógico "elegante". Por exemplo, porque todas as páginas do assistente são initalized, ao mesmo tempo, eu não posso ter os valores inseridos em uma página disponível para a próxima. Eu tenho que colocar um botão em cada página para obter os valores de uma página anterior, em vez de simplesmente ter campos preenchido automaticamente.

Já pensou em alternativas ao uso do assistente. Acho que a melhor idéia é ter alguns botões em um painel que mudam a informação sobre um outro painel, por exemplo, uma janela de divisão.

No entanto, não consigo encontrar qualquer documentação em wxPython sobre como alterar dinamicamente o painel. Tudo o que eu encontrei até agora é realmente muito estático, daí o uso do assistente. Mesmo o livro "wxPython em Ação" não mencioná-lo.

Existem tutoriais para fazer "painéis dinâmicos" ou uma melhor gestão de um mago?

Foi útil?

Solução

Aqui está um exemplo simples. Desta forma, você pode fazer o seu trabalho "assistente" como uma máquina de estados finitos onde os estados são diferentes páginas que são inicializados na demanda. Além disso, os dados são compartilhados entre as páginas.

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

Outras dicas

A demo wxPython tem um exemplo de um assistente "dinâmico". Páginas substituir GetNext () e GetPrev () para mostrar páginas dinamicamente. Isto mostra a técnica básica; você pode estendê-lo para adicionar e remover páginas, mudar as páginas na mosca, e páginas Reorganizar dinamicamente.

A classe assistente é apenas uma conveniência, no entanto. Você pode modificá-la, ou criar sua própria implementação. Um estilo que parece popular hoje em dia é a utilização de uma apresentação baseada em HTML; você pode emular isso com o controle wxHtml, ou o controle IEHtmlWindow se o seu aplicativo é apenas para Windows.

Você pode tentar usar um motor de fluxo de trabalho como WFTK . Neste caso particular autor tem feito algum trabalho em aplicativos baseados em wx usando WFTK e provavelmente pode direcioná-lo para exemplos.

Eu livrar-se assistente no todo. Eles são as coisas mais desagradáveis ??que já usei.

O problema que requer uma aplicação assistente onde você clica em 'próximo' é talvez um problema em que você poderia aplicar uma interface de usuário melhor de uma maneira pouco diferente. Em vez de trazer uma caixa de diálogo com o irritante 'próximo' -botão. Faça o seguinte:

abrir uma página. Quando o usuário insere as informações para a página, ampliar ou encurtá-lo de acordo com a entrada. Se suas necessidades de aplicação para fazer algum processamento para continuar, e é impossível de reverter depois disso, escrever uma nova página ou desativar a seção anterior da página atual. Quando você não precisa de qualquer entrada do usuário mais ou o aplicativo é terminado, você pode mostrar um botão ou activar uma já existente tal.

Eu não significa que você deve implementar tudo em browser. Faça simplesmente um recipiente de rolagem que podem conter botões e etiquetas em uma lista simples.

Benefício:. O usuário pode simplesmente clicar em uma aba, e você são incentivados a colocar todo o processamento para o fim de encher a página

Deve-se notar que um assistente deve ser a interface para mutli-passo, tarefas raramente-realizados. O assistente é usado para guiar o usuário através de algo que eles realmente não entendo, porque eles quase nunca fazê-lo.

E se alguns usuários podem fazer a tarefa com frequência, que pretende dar a esses usuários avançados uma interface leve para fazer a mesma coisa -. Mesmo que menos auto-explicativo

Veja: Windows Vista usuário - Principais Violações

Assistentes

Considerar alternativas leves primeiros, tais como caixas de diálogo, tarefa painéis ou páginas individuais. Feiticeiros são uma interface de usuário pesado, melhor usado para multi-passo, raramente realizada tarefa. Você não fazer tem que usar assistentes, você pode fornecer informações úteis e assistência em qualquer interface do usuário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top