Frage

Ich mache ein Programm, das die Assistenten Konzept paßt ideal; wird der Benutzer durch die Schritte ging ein Zeichen für ein Spiel zu erstellen.

Allerdings ist ich zu realisieren, dass die Grenzen des Assistenten machen es schwierig, „elegant“ logischen Fluss zu entwerfen. Zum Beispiel, weil alle Seiten des Assistenten zur gleichen Zeit initialisiert werden, kann ich die Werte nicht auf einer Seite zur Verfügung zum nächsten eingetragen. Ich habe einen Button auf jeder Seite setzt die Werte aus einer vorherigen Seite zu gelangen, anstatt einfach mit Feldern automatisch gefüllt.

Ich habe über Alternativen gedacht um die Assistenten zu verwenden. Ich denke, die beste Idee, einige Tasten auf einer Platte haben, ist, dass die Informationen auf einer anderen Platte zu ändern, zum Beispiel ein Splitter Fenster.

Allerdings kann ich keine Dokumentation in WxPython finden, wie das Panel dynamisch ändern. Alles, was ich bisher gefunden habe, ist wirklich ziemlich statisch, daher die Verwendung des Assistenten. Selbst das „wxPython in Aktion“ Buch es nicht erwähnt.

Gibt es Tutorials für die Herstellung von „dynamischen Panels“ oder eine bessere Verwaltung eines Assistenten?

War es hilfreich?

Lösung

Hier ist ein einfaches Beispiel. Auf diese Weise können Sie Ihre „Wizard“ Arbeit wie eine Finite-State-Maschine machen, wo Staaten unterschiedliche Seiten, die auf Anforderung initialisiert werden. Außerdem werden die Daten zwischen den Seiten geteilt.

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

Andere Tipps

Die WxPython Demo hat ein Beispiel für einen „dynamischen“ Assistenten. Seiten außer Kraft setzen GetNext () und GetPrev () Seiten dynamisch zu zeigen. Dies zeigt die grundlegende Technik; Sie können es erweitern, um Seiten hinzuzufügen und zu entfernen, ändern Seiten im Fluge und neu anordnen Seiten dynamisch.

Der Assistent Klasse ist nur eine Bequemlichkeit, though. Sie können es, ändern oder eine eigene Implementierung erstellen. Ein Stil, der heute scheint beliebt ist eine HTML-basierte Darstellung zu verwenden; Sie können dies mit dem Steuer wxHtml emulieren oder der IEHtmlWindow Kontrolle, wenn Ihre App ist nur für Windows.

Sie könnten versuchen, eine Workflow-Engine wie WFTK . In diesem speziellen Fall Autor hat mit WFTK einige Arbeit auf wx-basierten Anwendungen getan und wahrscheinlich können Sie auf Beispiele lenken.

Ich würde erhalten von Assistenten ganz loszuwerden. Sie sind die unangenehmen Dinge, die ich je benutzt habe.

Das Problem, das eine Assistenten-Anwendung erfordert, wo Sie auf ‚Weiter‘ klicken, ist vielleicht ein Problem, wenn Sie eine bessere Benutzeroberfläche in etwas anderen Art und Weise anwenden konnten. Anstatt einen Dialog mit lästigen ‚next‘ -Schaltfläche Erziehung. Tun Sie dies:

eine Seite öffnen. Wenn der Benutzer die Informationen auf der Seite einfügt, verlängern oder verkürzen sie den Eingang nach. Wenn Ihre Anwendung eine Verarbeitung tun muss fortgesetzt werden, und es ist unmöglich, danach zurückzukehren, schreiben Sie eine neue Seite oder den früheren Abschnitt der aktuellen Seite deaktivieren. Wenn Sie von dem Benutzer keine Eingabe mehr benötigen oder die App fertig ist, können Sie auf eine Schaltfläche zeigen oder ermöglichen eine bestehende so.

Ich meine nicht Sie alles in Browser implementieren sollte. Machen Sie einfach einen Scroll-Container, Schaltflächen und Beschriftungen in einer flachen Liste enthalten kann.

Vorteil: Der Benutzer kann nur auf eine Registerkarte klicken, und Sie werden aufgefordert, die gesamte Verarbeitung in das Ende zu setzen, die Seite zu füllen

.

Es ist zu beachten, dass ein Assistent für die Schnittstelle für mutli-Schritt sein soll, selten erfüllten Aufgaben. Der Assistent wird verwendet, um den Benutzer durch etwas zu leiten sie nicht verstehen wirklich, weil sie fast nie tun.

Und wenn einige Benutzer könnten die Aufgabe häufig tun, wollen Sie diesen Power-User eine leichte Schnittstelle geben, das Gleiche zu tun -. Selbst wenn es weniger selbsterklärend

Siehe auch: Windows Vista User Experience Richtlinien - Top Verletzungen

  

Wizards

     

leichte Alternativen Betrachten wir zunächst, wie Dialogfelder, Aufgabe   Scheiben oder einzelne Seiten. Wizards sind   eine schwere UI, am besten für Multi-Schritt verwendet,   selten Aufgabe durchgeführt. Sie dies nicht tun   haben verwenden Assistenten-Sie bieten   hilfreiche Informationen und Unterstützung bei der   jede UI.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top