Pourquoi Ne .Hide()ing et .Show()ing Panneaux en wxPython Résultat dans le Redimensionnement Modification de la Disposition?
Comme mentionné dans mon question précédente, je suis en train de faire quelque chose de légèrement assistant-comme dans la fonction. J'ai réglé sur une seule image avec un sizer ajouté. Je construis des panneaux pour chacun des écrans, j'aimerais utilisateurs de voir, les ajouter à la trame de redimensionnement, puis basculer entre les panneaux par .Hide()
ing un panneau, puis de l'appel d'une coutume .ShowYourself()
sur le panneau suivant. Bien évidemment, j'aime les boutons pour rester dans le même endroit que l'utilisateur progresse à travers le processus.
J'ai lié ensemble de deux panneaux dans une boucle infinie par leur "Retour" et "Suivant" boutons de sorte que vous pouvez voir ce qui se passe. Le premier panneau de l'allure; tom10le code travaillé sur ce niveau, comme il se détournait mon initiale, de plus, avez-vous envie de tenter avec les frontières de voler dans tous les sens. Et puis le deuxième panneau semble avoir rétréci vers le bas pour le strict minimum. Comme nous le retourner pour le premier groupe, le retrait a eu lieu ici. Pourquoi est-elle l'air bien dans le premier volet, mais pas après que je retourne là-bas? Pourquoi appelle .Fit()
nécessaire si je ne veux pas un 10 pixel de 10 pixels liasse de gris? Et si c'est nécessaire, pourquoi ne .Fit()
donner des résultats incohérents?
Cette boucle infinie qui semble caractériser mon expérience avec elle: j'ai corrigé la mise en page sur un panneau, seulement pour trouver que le fait de passer des ruines de la mise en page pour les autres panneaux. - Je résoudre ce problème, en utilisant sizer_h.Add(self.panel1, 0)
au lieu de sizer_h.Add(self.panel1, 1, wx.EXPAND)
, et maintenant, mes mises en page sont à nouveau.
Pour l'instant, ma "solution" consiste à ajouter un mastersizer.SetMinSize((475, 592))
à chaque panneau master sizer (en commentaire dans le code ci-dessous). C'est un cruddy solution parce que 1) j'ai eu pour trouver les numéros qui fonctionnent par essai et erreur (-5 pixels pour la largeur, -28 pixels pour la hauteur). 2) je ne comprends pas pourquoi le problème sous-jacent qui se passe encore.
Ce qui est de la bonne, de la non-laid solution? Au lieu d'ajouter tous les panneaux à l'image de la calibreuse à la fois, devraient armoires de commutation comportent .Detach()
ing que le panneau du châssis du sizer et puis .Add()
ing le panneau suivant, à l'image du sizer? Est-il un .JustMakeThisFillThePanel()
méthode cacher quelque part j'ai manqué à la fois de la wxWidgets et la wxPython documents en ligne?
Je suis évidemment manque quelque chose dans mon modèle mental de mise en page. Minimaliste code collé ci-dessous.
import wx
import sys
class My_App(wx.App):
def OnInit(self):
self.frame = My_Frame(None)
self.frame.Show()
self.SetTopWindow(self.frame)
return True
def OnExit(self):
print 'Dying ...'
class My_Frame(wx.Frame):
def __init__(self, image, parent=None,id=-1, title='Generic Title', pos=wx.DefaultPosition, style=wx.CAPTION | wx.STAY_ON_TOP):
size = (480, 620)
wx.Frame.__init__(self, parent, id, 'Program Title', pos, size, style)
sizer_h = wx.BoxSizer(wx.HORIZONTAL)
self.panel0 = User_Interaction0(self)
sizer_h.Add(self.panel0, 1, wx.EXPAND)
self.panel1 = User_Interaction1(self)
sizer_h.Add(self.panel1, 1, wx.EXPAND)
self.SetSizer(sizer_h)
self.panel0.ShowYourself()
def ShutDown(self):
self.Destroy()
class User_Interaction0(wx.Panel):
def __init__(self, parent, id=-1):
wx.Panel.__init__(self, parent, id)
# master sizer for the whole panel
mastersizer = wx.BoxSizer(wx.VERTICAL)
#mastersizer.SetMinSize((475, 592))
mastersizer.AddSpacer(15)
# build the top row
txtHeader = wx.StaticText(self, -1, 'Welcome to This Boring\nProgram', (0, 0))
font = wx.Font(16, wx.DEFAULT, wx.NORMAL, wx.BOLD)
txtHeader.SetFont(font)
txtOutOf = wx.StaticText(self, -1, '1 out of 7', (0, 0))
rowtopsizer = wx.BoxSizer(wx.HORIZONTAL)
rowtopsizer.Add(txtHeader, 3, wx.ALIGN_LEFT)
rowtopsizer.Add((0,0), 1)
rowtopsizer.Add(txtOutOf, 0, wx.ALIGN_RIGHT)
mastersizer.Add(rowtopsizer, 0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15)
# build the middle row
text = 'PANEL 0\n\n'
text = text + 'This could be a giant blob of explanatory text.\n'
txtBasic = wx.StaticText(self, -1, text)
font = wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
txtBasic.SetFont(font)
mastersizer.Add(txtBasic, 1, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15)
# build the bottom row
btnBack = wx.Button(self, -1, 'Back')
self.Bind(wx.EVT_BUTTON, self.OnBack, id=btnBack.GetId())
btnNext = wx.Button(self, -1, 'Next')
self.Bind(wx.EVT_BUTTON, self.OnNext, id=btnNext.GetId())
btnCancelExit = wx.Button(self, -1, 'Cancel and Exit')
self.Bind(wx.EVT_BUTTON, self.OnCancelAndExit, id=btnCancelExit.GetId())
rowbottomsizer = wx.BoxSizer(wx.HORIZONTAL)
rowbottomsizer.Add(btnBack, 0, wx.ALIGN_LEFT)
rowbottomsizer.AddSpacer(5)
rowbottomsizer.Add(btnNext, 0)
rowbottomsizer.AddSpacer(5)
rowbottomsizer.AddStretchSpacer(1)
rowbottomsizer.Add(btnCancelExit, 0, wx.ALIGN_RIGHT)
mastersizer.Add(rowbottomsizer, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15)
# finish master sizer
mastersizer.AddSpacer(15)
self.SetSizer(mastersizer)
self.Raise()
self.SetPosition((0,0))
self.Fit()
self.Hide()
def ShowYourself(self):
self.Raise()
self.SetPosition((0,0))
self.Fit()
self.Show()
def OnBack(self, event):
self.Hide()
self.GetParent().panel1.ShowYourself()
def OnNext(self, event):
self.Hide()
self.GetParent().panel1.ShowYourself()
def OnCancelAndExit(self, event):
self.GetParent().ShutDown()
class User_Interaction1(wx.Panel):
def __init__(self, parent, id=-1):
wx.Panel.__init__(self, parent, id)
# master sizer for the whole panel
mastersizer = wx.BoxSizer(wx.VERTICAL)
#mastersizer.SetMinSize((475, 592))
mastersizer.AddSpacer(15)
# build the top row
txtHeader = wx.StaticText(self, -1, 'Read about This Boring\nProgram', (0, 0))
font = wx.Font(16, wx.DEFAULT, wx.NORMAL, wx.BOLD)
txtHeader.SetFont(font)
txtOutOf = wx.StaticText(self, -1, '2 out of 7', (0, 0))
rowtopsizer = wx.BoxSizer(wx.HORIZONTAL)
rowtopsizer.Add(txtHeader, 3, wx.ALIGN_LEFT)
rowtopsizer.Add((0,0), 1)
rowtopsizer.Add(txtOutOf, 0, wx.ALIGN_RIGHT)
mastersizer.Add(rowtopsizer, 0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15)
# build the middle row
text = 'PANEL 1\n\n'
text = text + 'This could be a giant blob of boring text.\n'
txtBasic = wx.StaticText(self, -1, text)
font = wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
txtBasic.SetFont(font)
mastersizer.Add(txtBasic, 1, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15)
# build the bottom row
btnBack = wx.Button(self, -1, 'Back')
self.Bind(wx.EVT_BUTTON, self.OnBack, id=btnBack.GetId())
btnNext = wx.Button(self, -1, 'Next')
self.Bind(wx.EVT_BUTTON, self.OnNext, id=btnNext.GetId())
btnCancelExit = wx.Button(self, -1, 'Cancel and Exit')
self.Bind(wx.EVT_BUTTON, self.OnCancelAndExit, id=btnCancelExit.GetId())
rowbottomsizer = wx.BoxSizer(wx.HORIZONTAL)
rowbottomsizer.Add(btnBack, 0, wx.ALIGN_LEFT)
rowbottomsizer.AddSpacer(5)
rowbottomsizer.Add(btnNext, 0)
rowbottomsizer.AddSpacer(5)
rowbottomsizer.AddStretchSpacer(1)
rowbottomsizer.Add(btnCancelExit, 0, wx.ALIGN_RIGHT)
mastersizer.Add(rowbottomsizer, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15)
# finish master sizer
mastersizer.AddSpacer(15)
self.SetSizer(mastersizer)
self.Raise()
self.SetPosition((0,0))
self.Fit()
self.Hide()
def ShowYourself(self):
self.Raise()
self.SetPosition((0,0))
self.Fit()
self.Show()
def OnBack(self, event):
self.Hide()
self.GetParent().panel0.ShowYourself()
def OnNext(self, event):
self.Hide()
self.GetParent().panel0.ShowYourself()
def OnCancelAndExit(self, event):
self.GetParent().ShutDown()
def main():
app = My_App(redirect = False)
app.MainLoop()
if __name__ == '__main__':
main()
il fonctionne très bien sur GTK
Je me demande si il ya une différence fonctionnelle entre GTK et Windows 7 (mon plate-forme cible) qui n'a pas été pris en compte dans la version actuelle de wxPython pour Windows. C'est bon à savoir, Steven. Cela signifie que peut-être la façon dont je pense à propos de ce qui n'est pas complètement éteint.
Ya. Je l'ai essayé et il ne se déplie pas pour moi non plus. Juste jeter quelque chose... n'appelant
self.SetSizer(self.GetSizer())
à la fin de ShowYourself
faire quelque chose? Je suis loin de mon dev. la machine atm.Désolé, je voulais dire
self.GetParent().SetSizer(self.GetParent().GetSizer())
OriginalL'auteur MetaHyperBolic | 2010-04-01
Vous devez vous connecter pour publier un commentaire.
Je pense que j'ai tout compris. Au lieu d'appels à la
Show
etHide
méthodes de panneaux, vous devez appeler leShow
etHide
méthodes de la racine de redimensionnement:devient
...et ainsi de suite.
Aussi, après chaque appel, vous devez
Ah, et j'ai été peaufiner mon programme lorsque vous avez ajouté de Mise en page! Sur le point de donner un coup de feu.
Qui a travaillé! Qui ne doit être appelé à la fin de la ShowYourself() fonction. Donc, mon problème conceptuel était que j'étais ignorant la hiérarchie des sizers, et votre solution est que ces derniers doivent être appelés. Avez-vous un Amazon liste de souhaits où je pourrais l'acheter vous un livre? Sérieusement, ce problème m'avait assez bas.
Pas de problème, je passe parfois des heures à essayer de trouver pourquoi certaines bloc de wxWidgets code ne fonctionne pas. (Ou wxPython) Juste content d'avoir pu aider. Oh, et si vous le vouliez, vous pourriez upvote ma réponse. (En cliquant sur la flèche à côté d'elle 🙂
C'est bizarre. Il dit que je ne suis pas inscrit quand j'ai essayé de upvote. Ce qui s'est passé avant. Le temps d'aller chercher dans la FAQ.
OriginalL'auteur Nathan Osman
Ouais, je sais que c'est déjà répondu, mais vous pouvez y aller de toute façon:
Vous ne devriez avoir à appeler Layout() sur le panneau de la mère, donc, quelque chose comme de l'auto.GetParent().Layout() devrait faire l'affaire. Voir cet article: http://www.blog.pythonlibrary.org/2010/06/16/wxpython-how-to-switch-between-panels/
Si vous voulez que les boutons pour toujours afficher, de créer deux panneaux verticaux sizer. L'une sur le dessus va afficher vos panneaux et de l'autre sur le fond montrera les boutons. Ensuite, utilisez PubSub ou quelque chose à communiquer entre eux.
Layout()
pour les parents que pour ce que l'autre réponse suggéréOriginalL'auteur Mike Driscoll