【问题标题】:wxPython: Handling events in a widget that is inside a notebookwxPython:处理笔记本内小部件中的事件
【发布时间】:2009-07-29 17:58:41
【问题描述】:

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

笔记本会以某种方式阻止事件吗?我该如何解决?

【问题讨论】:

    标签: python user-interface event-handling wxpython


    【解决方案1】:

    我尝试重现您的问题,但对我来说效果很好。我能想到的唯一一件事是您的一个类也绑定到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()
    

    【讨论】:

    • 对,你的例子有效。我的问题只是一些愚蠢和无关的东西,我在某处使用了错误的 init
    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多