WxPython:如何通过显示和隐藏大小器中的项目来移动大小器中的项目

WxPython:如何通过显示和隐藏大小器中的项目来移动大小器中的项目,wxpython,Wxpython,我成功地举了一个小例子来说明我想要实现的目标。当我双击绿色面板时,它会消失,这就是我想要的,当我双击红色面板时,绿色面板再次出现,这也很好。 我遇到的问题是,当红色面板未显示时,如何向上移动绿色面板以取代红色面板,并将绿色面板移回红色面板显示时的状态,而不必更改它们在栅格尺寸测量器中的位置 有人能帮忙吗 下面是我试图实现的模板代码: import wx class myframe(wx.Frame): def __init__(self): "Constructor. N

我成功地举了一个小例子来说明我想要实现的目标。当我双击绿色面板时,它会消失,这就是我想要的,当我双击红色面板时,绿色面板再次出现,这也很好。 我遇到的问题是,当红色面板未显示时,如何向上移动绿色面板以取代红色面板,并将绿色面板移回红色面板显示时的状态,而不必更改它们在栅格尺寸测量器中的位置

有人能帮忙吗

下面是我试图实现的模板代码:

import wx
class myframe(wx.Frame):
    def __init__(self):
        "Constructor. No arguments"
        wx.Frame.__init__(self, None, size=(2000,2000))
        self.myPanel1 = wx.Panel( self, size=(300, 300) )
        myPanel2 = wx.Panel( self, size=(300, 300) )

        self.myPanel1.SetBackgroundColour("green")
        myPanel2.SetBackgroundColour("red")
        myGridSizer = wx.GridBagSizer()
        myGridSizer.Add(self.myPanel1, pos=(0, 0), span=(1,1), flag=wx.EXPAND)
        myGridSizer.Add(myPanel2, pos=(1, 0), span=(1,1), flag=wx.EXPAND)
        self.SetSizer(myGridSizer)
        self.myPanel1.Bind(wx.EVT_LEFT_DCLICK, self.hideMe)
        myPanel2.Bind(wx.EVT_LEFT_DCLICK, self.showMe)

    def hideMe(self, event):
        print "hide!"
        self.myPanel1.Hide()

    def showMe(self, event):
        print "show!"
        self.myPanel1.Show()

if __name__ == "__main__":
    print "Running Demo"
    app = wx.App()
    region = myframe()
    region.Show()
    app.MainLoop()
在调用Hide和Show之后调用self.Layout()。 我添加了“myGridSizer.SetEmptyCellSize((0,0))”以消除顶部的间隙

import wx
class myframe(wx.Frame):
    def __init__(self):
        "Constructor. No arguments"
        wx.Frame.__init__(self, None, size=(2000,2000))
        self.myPanel1 = wx.Panel( self, size=(300, 300) )
        myPanel2 = wx.Panel( self, size=(300, 300) )

        self.myPanel1.SetBackgroundColour("green")
        myPanel2.SetBackgroundColour("red")
        myGridSizer = wx.GridBagSizer()
        myGridSizer.Add(self.myPanel1, pos=(0, 0), span=(1,1), flag=wx.EXPAND)
        myGridSizer.Add(myPanel2, pos=(1, 0), span=(1,1), flag=wx.EXPAND)
        self.SetSizer(myGridSizer)
        self.myPanel1.Bind(wx.EVT_LEFT_DCLICK, self.hideMe)
        myPanel2.Bind(wx.EVT_LEFT_DCLICK, self.showMe)
        myGridSizer.SetEmptyCellSize((0, 0))

    def hideMe(self, event):
        print "hide!"
        self.myPanel1.Hide()
        self.Layout()

    def showMe(self, event):
        print "show!"
        self.myPanel1.Show()
        self.Layout()

if __name__ == "__main__":
    print "Running Demo"
    app = wx.App()
    region = myframe()
    region.Show()
    app.MainLoop()
在调用Hide和Show之后调用self.Layout()。 我添加了“myGridSizer.SetEmptyCellSize((0,0))”以消除顶部的间隙

import wx
class myframe(wx.Frame):
    def __init__(self):
        "Constructor. No arguments"
        wx.Frame.__init__(self, None, size=(2000,2000))
        self.myPanel1 = wx.Panel( self, size=(300, 300) )
        myPanel2 = wx.Panel( self, size=(300, 300) )

        self.myPanel1.SetBackgroundColour("green")
        myPanel2.SetBackgroundColour("red")
        myGridSizer = wx.GridBagSizer()
        myGridSizer.Add(self.myPanel1, pos=(0, 0), span=(1,1), flag=wx.EXPAND)
        myGridSizer.Add(myPanel2, pos=(1, 0), span=(1,1), flag=wx.EXPAND)
        self.SetSizer(myGridSizer)
        self.myPanel1.Bind(wx.EVT_LEFT_DCLICK, self.hideMe)
        myPanel2.Bind(wx.EVT_LEFT_DCLICK, self.showMe)
        myGridSizer.SetEmptyCellSize((0, 0))

    def hideMe(self, event):
        print "hide!"
        self.myPanel1.Hide()
        self.Layout()

    def showMe(self, event):
        print "show!"
        self.myPanel1.Show()
        self.Layout()

if __name__ == "__main__":
    print "Running Demo"
    app = wx.App()
    region = myframe()
    region.Show()
    app.MainLoop()

从技术上讲,如果不实际移动小部件,就无法让它以这种方式工作。在Yoriz的例子中,它几乎将红色面板放置在绿色面板的位置,但您会注意到,红色面板与框架顶部之间有一条灰色带。这是因为网格大小调整器仍在为隐藏的绿色面板保留空间


如果您希望它是无缝的,那么您需要查看sizer的Detach()和各种Insert()方法:

从技术上讲,如果不实际移动小部件,就无法使它以这种方式工作。在Yoriz的例子中,它几乎将红色面板放置在绿色面板的位置,但您会注意到,红色面板与框架顶部之间有一条灰色带。这是因为网格大小调整器仍在为隐藏的绿色面板保留空间


如果您希望它是无缝的,那么您需要查看sizer的Detach()和各种Insert()方法:

添加了这一行,保留空间消失了myGridSizer。SetEmptyCellSize((0,0))Detach和Insert似乎是执行此操作的另一种有效方法,但是,我必须保留一些小部件及其相应位置的列表,以便我可以分离并将它们重新插入正确的位置。添加了这一行,保留的空间就消失了myGridSizer。SetEmptyCellSize((0,0))分离和插入似乎是执行此操作的另一种有效方法,但是,我必须保留一些小部件及其相应位置的列表,以便我可以将它们分离并重新插入正确的位置。感谢Yoriz,似乎通过添加SetEmptyCellSize,顶部的小灰色边框消失了。:)注意:似乎SetEmptyCell的方法仅适用于网格尺寸测量仪,而不是所有尺寸测量仪,这在我的情况下是可以的,但如果使用另一个尺寸测量仪,可能需要不同的方法。如果您在何处使用Boxsizer,它可以正常工作,没有留下灰色边框,我认为SetEmptyCellSize只适用于使用GridBagSizer时。感谢Yoriz,似乎通过添加SetEmptyCellSize,顶部的小灰色边框消失了。:)注意:似乎SetEmptyCell的方法仅适用于网格尺寸测量仪,而不是所有尺寸测量仪,这在我的情况下是可以的,但如果使用另一个尺寸测量仪,可能需要不同的方法。如果您在何处使用Boxsizer,它可以正常工作,没有留下灰色边框,我认为SetEmptyCellSize只适用于使用GridBagSizer时。