2010-03-25 5 views
0

Je suis plutôt nouveau à wx/python alors s'il vous plaît excuser si cela est stupide ou mal décrit.sizer.replace() peint "sur" vieux sizercontent

Je remplace un calibreur imbriqué par un nouveau, comme indiqué dans l'extrait ci-dessous. après un peu de bricolage tout semble fonctionner mais le re-dessin du parent-sizer. le contenu de l'ancien sizer imbriqué reste et se "peint" sur le nouveau contenu sizer malgré mon sizer.Layout() de configuration du système

:
- python 2.5.5.2 et 2.6.4
- wxpython 2.8

# -*- coding: utf8 -*- 

import wx 

class Frame(wx.Frame): 
def __init__(self): 
    wx.Frame.__init__(self, None, wx.ID_ANY, title='test') 

class Test(wx.App): 
    def OnInit(self): 
     frame = Frame() 
     self.panel = wx.Panel(frame) 
     self.panel.SetBackgroundColour('red') 
     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     button = wx.Button(self.panel, wx.ID_ANY, 'TEST') 

     self.hsizer = wx.BoxSizer(wx.HORIZONTAL) 
     self.hsizer.Add(wx.StaticText(self.panel, wx.ID_ANY, 'nacknack')) 

     self.sizer.Add(button) 
     self.Bind(wx.EVT_BUTTON, self.on_test_button, button) 
     self.text = wx.StaticText(self.panel, wx.ID_ANY, 'FOOO') 
     self.sizer.Add(self.text) 
     self.sizer.Add(self.hsizer) 
     self.panel.SetSizer(self.sizer) 
     frame.Show() 
     return True 

    def on_test_button(self, evt): 
     tmpsizer = wx.BoxSizer(wx.VERTICAL) 
     tmpsizer.Add(self.makesizer()) 
     tmpitem = tmpsizer.GetChildren()[0] 

     self.sizer.Replace(2, tmpitem) 
     self.sizer.Layout() 

    def makesizer(self): 
     testsizer = wx.BoxSizer(wx.HORIZONTAL) 
     testsizer.Add(wx.StaticText(self.panel, wx.ID_ANY, 'testsizer')) 
     return testsizer 

    if __name__ == '__main__': 
     app = Test() 
     app.MainLoop() 

Répondre

0

Après avoir consulté votre code (et il n'a pas été facile - s'il vous plaît envisager de le formater le temps différemment suivant - le regroupement peut-être les self.sizer.add fonctions ou quelque chose) Je pense que j'ai découvert votre bug:

Lorsque yo vous appelez Replace sur un calibreur, l'élément remplacé n'est pas détruit mais devient n'est plus géré par le calibreur. Vous avez besoin de cacher ou de détruire l'ancienne fenêtre (le wx.StaticText)

Comme mentionné dans les documents wxWidgets:

virtualbool Replace (wxWindow *oldwin, wxWindow *newwin, bool recursive=false)     Detaches the given oldwin from the sizer and replaces it with the given newwin.

Questions connexes