Question

Je crée un programme qui correspond parfaitement au concept de l'assistant; l'utilisateur est guidé à travers les étapes pour créer un personnage pour un jeu.

Cependant, je me rends compte que les limitations de l'assistant rendent difficile la conception "élégant". flux logique. Par exemple, étant donné que toutes les pages de l'Assistant sont désactivées en même temps, les valeurs entrées dans une page ne peuvent pas être disponibles pour la suivante. Je dois mettre un bouton sur chaque page pour obtenir les valeurs d'une page précédente plutôt que de simplement avoir des champs automatiquement remplis.

J'ai pensé à des alternatives à l'utilisation de l'assistant. Je pense que la meilleure idée est d’avoir des boutons sur un panneau qui changent les informations d’un autre panneau, une fenêtre de séparation.

Cependant, je ne trouve aucune documentation dans wxPython sur la modification dynamique du panneau. Tout ce que j'ai trouvé jusqu'à présent est vraiment très statique, d'où l'utilisation de l'assistant. Même le "wxPython in Action" le livre n'en parle pas.

Existe-t-il des tutoriels permettant de créer des "panneaux dynamiques"? ou une meilleure gestion d'un assistant?

Était-ce utile?

La solution

Voici un exemple simple. De cette façon, vous pouvez créer votre "assistant". fonctionne comme une machine à états finis où les états sont des pages différentes initialisées à la demande. De plus, les données sont partagées entre les pages.

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

Autres conseils

La démonstration de wxPython contient un exemple de "dynamique". sorcier. Les pages remplacent GetNext () et GetPrev () pour afficher les pages de manière dynamique. Cela montre la technique de base; vous pouvez l'étendre pour ajouter et supprimer des pages, modifier des pages à la volée et réorganiser les pages de manière dynamique.

La classe d’assistant n’est cependant qu’une commodité. Vous pouvez le modifier ou créer votre propre implémentation. Un style qui semble aujourd'hui populaire consiste à utiliser une présentation basée sur HTML; vous pouvez émuler cela avec le contrôle wxHtml ou avec le contrôle IEHtmlWindow si votre application est uniquement Windows.

Vous pouvez utiliser un moteur de flux de travail tel que WFTK . Dans ce cas particulier, l'auteur a travaillé sur des applications basées sur Wx à l'aide de WFTK et peut probablement vous diriger vers des exemples.

Je me débarrasserais du sorcier en entier. Ce sont les choses les plus désagréables que j'ai jamais utilisées.

Le problème qui nécessite un assistant-application dans lequel vous cliquez sur "Suivant" est peut-être un problème où vous pourriez appliquer une meilleure interface utilisateur d'une manière légèrement différente. Au lieu de faire apparaître une boîte de dialogue avec le bouton 'suivant' agaçant. Faites ceci:

Affichez une page. Lorsque l'utilisateur insère les informations dans la page, étendez-les ou raccourcissez-les en fonction de l'entrée. Si votre application doit effectuer certains traitements pour continuer et qu'il est impossible de revenir à la suite, écrivez une nouvelle page ou désactivez la section précédente de la page en cours. Lorsque vous n'avez plus besoin de l'entrée de l'utilisateur ou que l'application est terminée, vous pouvez afficher un bouton ou activer un tel fichier existant.

Je ne veux pas dire que vous devriez tout mettre en œuvre dans le navigateur. Créez simplement un conteneur de défilement pouvant contenir des boutons et des étiquettes dans une liste simple.

Avantage: l'utilisateur peut simplement cliquer sur un onglet et vous êtes encouragé à mettre tous les traitements à la fin du remplissage de la page.

Il convient de noter qu’un assistant devrait être l’interface pour les tâches à plusieurs étapes peu fréquentes. Cet assistant est utilisé pour guider l'utilisateur à travers quelque chose qu'il ne comprend pas vraiment, car il ne le fait presque jamais.

Et si certains utilisateurs sont à même de s’acquitter de cette tâche fréquemment, vous souhaitez leur donner une interface légère leur permettant de faire la même chose, même si elle est moins explicite.

Voir: Consignes relatives à l'expérience utilisateur de Windows Vista - Violations majeures

  

Assistants

     

Envisagez d’abord les alternatives légères, telles que les boîtes de dialogue, les tâches   des volets ou des pages uniques. Des assistants sont disponibles.   une interface utilisateur lourde, mieux utilisée pour plusieurs étapes,   tâche rarement effectuée. Tu ne   devez utiliser les assistants & # 8212; vous pouvez fournir   informations utiles et assistance en   toute interface utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top