我有一个wxPython笔记本,在这种情况下是 wx.aui.AuiNotebook 。 (但是这个问题也发生在其他类型的笔记本上。)在我的笔记本中我有一个小部件,在这种情况下是 ScrolledPanel 的子类,我正在尝试做一些自定义事件处理(对于 wx.EVT_KEY_DOWN )。但是,事件没有得到处理。我在笔记本之外检查了我的代码,并且事件处理工作正常,但是当我将我的小部件放在笔记本中时,事件发生时似乎没有调用事件处理程序。

笔记本电脑是否以某种方式阻止了这一事件?我该如何解决这个问题?

有帮助吗?

解决方案

我尝试重现你的问题,但它对我来说很好。我唯一能想到的是,你的一个类也绑定到 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()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top