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.

Pourquoi Ne .Hide()ing et .Show()ing Panneaux en wxPython Résultat dans le Redimensionnement Modification de la Disposition?

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()
Je vais regarder dans cette.
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