WxPython:如何通过在其中显示和隐藏项目来移动sizer中的项目

时间:2013-06-13 16:57:29

标签: wxpython

我设法做了一个我希望实现的小例子。当我双击绿色面板时,它消失了我想要的东西,当我双击红色面板时,绿色面板再次出现,这也很好。 我遇到的问题是如何在未显示红色面板时将绿色面板向上移动以取代红色面板,并将绿色面板移回红色面板出现时的状态,而无需更改它们在网格大小中的位置。

有人可以帮忙吗?

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

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()

2 个答案:

答案 0 :(得分:1)

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

如果您希望它是无缝的,您可能需要查看Satch的Detach()和各种Insert()方法:http://wxpython.org/docs/api/wx.Sizer-class.html

答案 1 :(得分:0)

调用隐藏和显示后调用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()