可折叠面板无法通过鼠标展开/折叠或响应鼠标操作
我尝试使用wxPython工具包中的可折叠面板组件(CollapsiblePane)。我在面板中直接添加了两个复选框,并在面板下方的可折叠面板中添加了两个复选框。我的问题是,可折叠面板及其下面的组件对鼠标事件没有反应,也就是说,我无法展开或折叠这个面板,或者与可折叠面板下的组件进行互动。
下面是示例代码。试着切换可折叠面板下的复选框,它们没有反应。
import wx
import sys
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__( self, None, -1, "My Frame" ) # , size=(300,300)
self.panel = wx.Panel(self)
sizer = wx.FlexGridSizer(rows=2, cols=2, hgap=5, vgap=5)
CB1 = wx.CheckBox( self.panel, -1, "dene-1")
CB2 = wx.CheckBox( self.panel, -1, "dene-2")
CP = wx.CollapsiblePane(self, -1, label="TITLE", style=wx.CP_DEFAULT_STYLE|wx.CP_NO_TLW_RESIZE)
self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.OnPaneChanged, CP)
win = CP.GetPane()
pansizer = wx.BoxSizer( wx.VERTICAL )
cb1 = wx.CheckBox( win, -1, "enable 1")
cb2 = wx.CheckBox( win, -1, "enable 2")
pansizer.Add( cb1, 0, wx.GROW | wx.ALL )
pansizer.Add( cb2, 0, wx.GROW | wx.ALL )
win.SetSizer( pansizer )
pansizer.SetSizeHints(win)
CP.Expand()
sizer.Add( CB1, 0, wx.ALL )
sizer.Add( CB2, 0, wx.ALL )
sizer.Add( CP, 0, wx.RIGHT|wx.LEFT|wx.EXPAND, 5 )
self.panel.SetSizer( sizer )
self.panel.Fit()
def OnPaneChanged(self, evt):
# redo the layout
self.Layout()
if __name__=="__main__":
app = wx.App()
frame = MyFrame()
frame.Show(True)
app.MainLoop()
1 个回答
0
你创建了一个自.panel对象,但把可折叠的面板放在了你的框架下面。你需要改变一下窗口更新的方式。首先,布局需要先进行,然后你要调整面板的大小,最后再调整窗口的大小。下面的代码就是这样做的。我把框架的大小改了一下,这样你就能看到面板的展开和折叠效果。
def __init__(self):
wx.Frame.__init__( self, None, -1, "My Frame" ) # , size=(300,300)
self.panel = wx.Panel(self)
sizer = wx.FlexGridSizer(rows=2, cols=2, hgap=5, vgap=5)
CB1 = wx.CheckBox( self.panel, -1, "dene-1")
CB2 = wx.CheckBox( self.panel, -1, "dene-2")
CP = wx.CollapsiblePane(self.panel, -1, label="TITLE", style=wx.CP_DEFAULT_STYLE|wx.CP_NO_TLW_RESIZE)
CP.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.OnPaneChanged)
win = CP.GetPane()
pansizer = wx.BoxSizer( wx.VERTICAL )
cb1 = wx.CheckBox( win, -1, "enable 1")
cb2 = wx.CheckBox( win, -1, "enable 2")
pansizer.Add( cb1, 0, wx.GROW | wx.ALL )
pansizer.Add( cb2, 0, wx.GROW | wx.ALL )
win.SetSizer( pansizer )
pansizer.SetSizeHints(win)
CP.Collapse()
sizer.Add( CB1, 0, wx.ALL )
sizer.Add( CB2, 0, wx.ALL )
sizer.Add( CP, 0, wx.RIGHT|wx.LEFT|wx.EXPAND, 5 )
self.panel.SetSizerAndFit( sizer )
self.Fit()
def OnPaneChanged(self, evt):
# redo the layout
self.panel.GetSizer().Layout()
self.panel.Fit()
self.Fit()
if name=="main": app = wx.App() frame = MyFrame() frame.Show(True) app.MainLoop()