Alternatives à un sorcier
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?
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.
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.