可折叠面板无法通过鼠标展开/折叠或响应鼠标操作

0 投票
1 回答
806 浏览
提问于 2025-04-16 09:08

我尝试使用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()

撰写回答