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

1 投票
1 回答
920 浏览
提问于 2025-04-18 12:13

我正在尝试创建一个框架,里面有三个静态文本(StaticText)条目,排列在一个垂直的盒子布局(BoxSizer)中。当你点击其中一个条目时,我希望在它正下方出现一个第二个静态文本对象,并且所有其他条目也会向下移动。

现在,我可以在点击第一个条目时显示第二个静态文本,但我不知道怎么把第二个文本对象放在第一个下面,而不覆盖任何东西。我的代码在下面。

我会很感激你的帮助!

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

你需要在代码中添加这一行:

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

这样做会重新绘制面板的布局和里面的所有组件。你也可以使用一个叫做 Layout() 的方法,具体写法是:self.sizer.Layout()

撰写回答