wxPython:Sizer:在列中隐藏/显示对象,同时转移其他条目

时间:2014-07-05 20:42:40

标签: python wxpython

我正在尝试创建一个包含3个StaticText条目的框架(在垂直BoxSizer中)。当您单击某个条目时,我希望第二个StaticText对象直接显示在它下面(并且它下面的所有其他条目都会向下移动)。

现在,我可以在单击第一个静态文本时显示第二个静态文本,但我不知道如何在第一个文本对象下面获取第二个文本对象,而不会覆盖任何内容。我的代码附在下面。

我感谢你的帮助!

import wx

class myFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Hiding t2 properly')
        self.panel = wx.Panel(self, -1)
        self.panel.SetMaxSize((200,-1))
        self.t1s = []
        self.t2s = []
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        for i in xrange(3):
            ## t1 is always visible.
            t1 = wx.StaticText(self.panel, label="t1-"+str(i))
            ## t2 should appear under its respective t1 when t1 is clicked.
            ##(it should also disappear, without leaving blank space, when
            ## t1 is clicked again).
            t2 = wx.StaticText(self.panel, label="t2-"+str(i))
            self.t1s.append(t1)
            self.t2s.append(t2)
            self.sizer.Add(t1, 0, wx.EXPAND)
            self.sizer.Add(t2, 0, wx.EXPAND)
            t1.Bind(wx.EVT_LEFT_UP, lambda evt: self.onClick(evt))
            t2.Hide()
        self.panel.SetSizer(self.sizer)
        self.panel.SetAutoLayout(True)
        self.sizer.Fit(self.panel)

    def onClick(self, evt):
        t1 = evt.GetEventObject()
        i = self.t1s.index(t1)
        t2 = self.t2s[i]

        if t2.IsShown(): ## hide t2 and eliminate empty space
            t2.Hide()
            ## What else goes here?

        else: #show t2
            t2.Show()
            ## What else goes here?


app = wx.App()
frame = myFrame()
frame.Show()
app.MainLoop()

1 个答案:

答案 0 :(得分:0)

您需要将此行添加到代码中:

self.panel.Layout()
像这样

def onClick(self, evt):
    t1 = evt.GetEventObject()
    i = self.t1s.index(t1)
    t2 = self.t2s[i]
    if t2.IsShown():
        t2.Hide()
        self.panel.Layout()    
    else:
        t2.Show()
        self.panel.Layout()

这会重新绘制面板布局及其所有组件。您还可以使用sizer的Layout()方法:self.sizer.Layout()