wxPython:在笔记本内控件中处理事件

2 投票
1 回答
886 浏览
提问于 2025-04-15 13:15

我有一个wxPython的笔记本,具体来说是一个wx.aui.AuiNotebook。不过这个问题在其他类型的笔记本上也出现过。在我的笔记本里,有一个小部件,这里是一个ScrolledPanel的子类,我想为它做一些自定义的事件处理(比如wx.EVT_KEY_DOWN)。但是,这些事件没有被处理。我检查过我的代码,在笔记本外面事件处理是正常的,但当我把这个小部件放进笔记本里时,事件处理器似乎在事件发生时没有被调用。

难道笔记本会以某种方式阻止这个事件吗?我该怎么解决这个问题呢?

1 个回答

2

我试着重现你遇到的问题,但对我来说一切正常。我能想到的唯一原因是,你的某个类也绑定了 wx.EVT_KEY_DOWN 事件,但在它的回调函数中没有调用 wx.Event.Skip()。这样的话,就会阻止事件的进一步处理。如果你的滚动面板在事件处理程序的顺序中位于这样的对象之后,它就永远无法接收到这个事件。

作为参考,这里有一个我在Windows上测试过的例子。你做的事情和这个有很大不同吗?

import wx
import wx.aui, wx.lib.scrolledpanel

class AppFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        wx.Frame.__init__(self, *args, **kwds)

        # The notebook
        self.nb = wx.aui.AuiNotebook(self)

        # Create a scrolled panel
        panel = wx.lib.scrolledpanel.ScrolledPanel(self, -1)
        panel.SetupScrolling()
        self.add_panel(panel, 'Scrolled Panel')

        # Create a normal panel
        panel = wx.Panel(self, -1)
        self.add_panel(panel, 'Simple Panel')

        # Set the notebook on the frame
        self.sizer = wx.BoxSizer()
        self.sizer.Add(self.nb, 1, wx.EXPAND)
        self.SetSizer(self.sizer)

        # Status bar to display the key code of what was typed
        self.sb = self.CreateStatusBar()

    def add_panel(self, panel, name):
        panel.Bind(wx.EVT_KEY_DOWN, self.on_key)
        self.nb.AddPage(panel, name)

    def on_key(self, event):
        self.sb.SetStatusText("key: %d [%d]" % (event.GetKeyCode(), event.GetTimestamp()))
        event.Skip()

class TestApp(wx.App):
    def OnInit(self):
        frame = AppFrame(None, -1, 'Click on a panel and hit a key')
        frame.Show()
        self.SetTopWindow(frame)
        return 1

if __name__ == "__main__":
    app = TestApp(0)
    app.MainLoop()

撰写回答