wxPython:Sizer:隐藏/显示列中的对象,同时移动其他条目
我正在尝试创建一个框架,里面有三个静态文本(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()