Pregunta

Estoy creando un programa que encaja perfectamente con el concepto de asistente; El usuario es guiado a través de los pasos para crear un personaje para un juego.

Sin embargo, me doy cuenta de que las limitaciones del asistente hacen que sea difícil diseñar "elegante" flujo logico Por ejemplo, dado que todas las páginas del asistente se inicializan al mismo tiempo, no puedo tener los valores ingresados ??en una página disponibles para la siguiente. Tengo que poner un botón en cada página para obtener los valores de una página anterior en lugar de simplemente tener campos rellenados automáticamente.

He pensado en alternativas al uso del asistente. Creo que la mejor idea es tener algunos botones en un panel que cambien la información en otro panel, por ejemplo. una ventana divisoria.

Sin embargo, no puedo encontrar ninguna documentación en wxPython sobre cómo cambiar dinámicamente el panel. Todo lo que he encontrado hasta ahora es bastante estático, de ahí el uso del asistente. Incluso el " wxPython en Acción " El libro no lo menciona.

¿Hay tutoriales para crear " paneles dinámicos " ¿O mejor gestión de un asistente?

¿Fue útil?

Solución

Aquí hay un ejemplo simple. De esta manera puedes hacer tu " asistente " Funciona como una máquina de estados finitos donde los estados son páginas diferentes que se inicializan bajo demanda. Además, los datos se comparten entre 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()

Otros consejos

La demostración de wxPython tiene un ejemplo de " dinámica " mago. Las páginas anulan GetNext () y GetPrev () para mostrar las páginas dinámicamente. Esto muestra la técnica básica; puede ampliarlo para agregar y eliminar páginas, cambiar páginas sobre la marcha y reorganizar las páginas dinámicamente.

Sin embargo, la clase de asistente es solo una conveniencia. Puedes modificarlo, o crear tu propia implementación. Un estilo que parece popular hoy en día es usar una presentación basada en HTML; puedes emular esto con el control wxHtml o el control IEHtmlWindow si tu aplicación es solo para Windows.

Puede intentar usar un motor de flujo de trabajo como WFTK . En este caso particular, el autor ha realizado algún trabajo en aplicaciones basadas en wx utilizando WFTK y probablemente pueda dirigirlo a ejemplos.

Me libraría del mago en su totalidad. Son las cosas más desagradables que he usado.

El problema que requiere una aplicación de asistente donde hace clic en 'siguiente' es quizás un problema en el que podría aplicar una mejor interfaz de usuario de una manera un poco diferente. En lugar de abrir un diálogo con el molesto botón 'Siguiente'. Haz esto:

Muestra una página. Cuando el usuario inserta la información en la página, extiéndala o acórtela según la entrada. Si su aplicación necesita hacer algún procesamiento para continuar, y es imposible revertir después de eso, escriba una nueva página o deshabilite la sección anterior de la página actual. Cuando ya no necesite ninguna entrada del usuario o la aplicación haya finalizado, puede mostrar un botón o habilitar uno existente.

No quiero decir que debas implementarlo todo en el navegador. Haga simplemente un contenedor de desplazamiento que puede contener botones y etiquetas en una lista plana.

Beneficio: el usuario puede simplemente hacer clic en una pestaña y le recomendamos que ponga todo el procesamiento al final de la página.

Se debe tener en cuenta que un asistente debe ser la interfaz para tareas de varios pasos, que se realizan con poca frecuencia. El asistente se utiliza para guiar al usuario a través de algo que realmente no entiende, porque casi nunca lo hacen.

Y si algunos usuarios pueden hacer la tarea con frecuencia, usted quiere darles a esos usuarios avanzados una interfaz liviana para hacer lo mismo, incluso si no se explica por sí mismo.

Vea: Pautas de experiencia del usuario de Windows Vista - Violaciones principales

  

Asistentes

     

Considere primero alternativas livianas, como cuadros de diálogo, tareas   paneles, o páginas individuales. Los asistentes son   una interfaz de usuario pesada, mejor utilizada para varios pasos,   Tarea realizada con poca frecuencia. Tu no   Tienes que usar asistentes & # 8212; puedes proporcionar   Información útil y asistencia en   cualquier UI.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top