用wxPythonreplace具有新布局的现有布局

我是wxPython的新手。 我正在使用Gridbagsizer进行布局。 我几乎成功地做出了我想要的布局。 但对于一些未知的问题,这是一个问题。

我的目标是:我做了5个布局。 绿,红,蓝,黄,黑。 当我双击“这是testing运行”时,黄色布局应该被黑色布局完全替代。

究竟发生了什么:黄色被黑色所取代。 没有问题的。 但蓝色布局的位置由于某种原因而转移到底部。

我的代码是这样的:

import wx class myframe(wx.Frame): def __init__(self): "Constructor. No arguments" wx.Frame.__init__(self, None, size=(1000,700)) self.TitlePanel = wx.Panel( self, size=(350, 400) ) self.newPanel = wx.Panel( self, size=(300, 250) ) imgPanel = wx.Panel( self, size=(300, 250) ) modulePanel=wx.Panel( self, size=(350, 250) ) self.TCPanel=wx.Panel( self, size=(300, 250) ) ############################################ self.TitlePanel.SetBackgroundColour("green") imgPanel.SetBackgroundColour("red") modulePanel.SetBackgroundColour("blue") self.TCPanel.SetBackgroundColour("yellow") self.newPanel.SetBackgroundColour("black") self.newPanel.Hide() ############################################ self.myGridSizer = wx.GridBagSizer(1,1) self.myGridSizer.Add(self.TitlePanel, pos=(0, 0), span=(4,8), flag=wx.EXPAND) self.myGridSizer.Add(imgPanel, pos=(0, 10), span=(4,8), flag=wx.ALL) self.myGridSizer.Add(modulePanel, pos=(10, 0), span=(1,8), flag=wx.ALL) self.myGridSizer.Add(self.TCPanel, pos=(10, 10), span=(4,8), flag=wx.ALL) ############################################# self.text1 = wx.StaticText(self.TitlePanel, label="This is a test run",style=2,size=(350,-1)) font = wx.Font(18, wx.DECORATIVE, wx.ITALIC,wx.BOLD, wx.NORMAL) self.text1.SetFont(font) ############################################# self.SetSizer(self.myGridSizer) self.text1.Bind(wx.EVT_LEFT_DCLICK, self.hideMe) imgPanel.Bind(wx.EVT_LEFT_DCLICK, self.showMe) self.myGridSizer.SetEmptyCellSize((0, 0)) def hideMe(self, event): self.TCPanel.Hide() self.myGridSizer.Add(self.newPanel, pos=(5, 10), span=(4,8), flag=wx.ALL) self.newPanel.Show() self.Layout() def showMe(self, event): print "show!" self.newPanel.Hide() self.TCPanel.Show() self.Layout() if __name__ == "__main__": app = wx.App() region = myframe() region.Show() app.MainLoop() 

那么,我该如何更换布局,并保持现有的布局不变?

首先,你应该纠正你的text1被控制的方式。 如果它是TitlePanel的孩子,那么你应该为TitlePanel使用一个新的TitlePanel并把text1放在里面。 你的sizer应该遵循父子层次结构。

接下来,仅Hide()Show()是不够的,你必须正确地替换sizer中的元素。 最简单的方法是使用sizer.Replace(old_widget, new_widget)

 import wx class myframe(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, size=(1000,700)) self.TitlePanel = wx.Panel(self, size=(350, 400)) self.TitlePanel.SetBackgroundColour("green") self.newPanel = wx.Panel(self, size=(300, 250)) self.newPanel.SetBackgroundColour("black") self.newPanel.Hide() self.imgPanel = wx.Panel(self, size=(300, 250)) self.imgPanel.SetBackgroundColour("red") self.modulePanel=wx.Panel(self, size=(350, 250)) self.modulePanel.SetBackgroundColour("blue") self.TCPanel=wx.Panel(self, size=(300, 250)) self.TCPanel.SetBackgroundColour("yellow") self.myGridSizer = wx.GridBagSizer(1,1) self.myGridSizer.SetEmptyCellSize((0, 0)) self.myGridSizer.Add(self.TitlePanel, pos=(0, 0), span=(4,8), flag=wx.EXPAND) self.myGridSizer.Add(self.imgPanel, pos=(0, 10), span=(4,8), flag=wx.ALL) self.myGridSizer.Add(self.modulePanel, pos=(10, 0), span=(1,8), flag=wx.ALL) self.myGridSizer.Add(self.TCPanel, pos=(10, 10), span=(4,8), flag=wx.ALL) self.text1 = wx.StaticText(self.TitlePanel, label="This is a test run",style=2,size=(350,-1)) font = wx.Font(18, wx.DECORATIVE, wx.ITALIC,wx.BOLD, wx.NORMAL) self.text1.SetFont(font) self.titleSizer = wx.BoxSizer() self.titleSizer.Add(self.text1, flag=wx.TOP|wx.LEFT|wx.ALIGN_RIGHT,border=10) self.TitlePanel.SetSizer(self.titleSizer) self.SetSizer(self.myGridSizer) self.text1.Bind(wx.EVT_LEFT_DCLICK, self.hideMe) self.imgPanel.Bind(wx.EVT_LEFT_DCLICK, self.showMe) def hideMe(self, event): self.TCPanel.Hide() self.myGridSizer.Replace(self.TCPanel, self.newPanel) self.newPanel.Show() self.Layout() def showMe(self, event): self.newPanel.Hide() self.myGridSizer.Replace(self.newPanel, self.TCPanel) self.TCPanel.Show() self.Layout() if __name__ == "__main__": app = wx.App() region = myframe() region.Show() app.MainLoop() 

还有一些关于你的代码的注释:

  1. 不要用括号括住空格。 这是丑陋的,反对一般的Python风格。
  2. 不要将局部变量与小部件的对象属性混合在一起。 使用一种方法并坚持下去,最好使用对象属性。 这样你就可以用所有方法访问你的小部件。
  3. 通过属性设置等来创建小部件创建通常更具有可读性。在代码中很难找到哪个面板是哪种颜色的。