【问题标题】:Redirecting key events of child widgets to their parent frame widget将子小部件的关键事件重定向到其父框架小部件
【发布时间】:2011-06-14 07:26:36
【问题描述】:

有没有办法在 wxpython 中将所有子小部件的键事件重定向到其父框架的键事件,以便可以在一个方法中捕获所有键事件?

【问题讨论】:

    标签: wxpython


    【解决方案1】:

    您的子类只需要使用wx.PostEvent 将您的父小部件作为目标发布事件。然后您的父小部件可以将事件绑定到其事件处理程序。如果您需要知道事件来自哪个小部件,您可以在事件上调用GetName()。这是一个小例子。

    import wx
    
    class ChildWidget(wx.TextCtrl):
    
        def __init__(self, parent, name, pos):
            super(ChildWidget, self).__init__(parent, name=name, pos=pos)
            self.parent = parent
            self.Bind(wx.EVT_KEY_DOWN, self.keyPressed)
    
        def keyPressed(self, event):
            wx.PostEvent(self.parent, event)
    
    class MainWidget(wx.Frame):
    
        def __init__(self, parent, title):
            super(MainWidget, self).__init__(parent, title=title)
    
            self.child1 = ChildWidget(self, name="Child1", pos=(0,0))      
            self.child2 = ChildWidget(self, name="Child2", pos=(100,0))
    
            self.Bind(wx.EVT_KEY_DOWN, self.ChildKeyPressed)
    
            self.Layout()
    
        def ChildKeyPressed(self, event):
            print "Keypress from " + event.GetEventObject().GetName()
    
    
    if __name__ == '__main__':
        app = wx.App(redirect=False)
        frame = MainWidget(None, "test")
        frame.Show(True)
        app.MainLoop()
    

    【讨论】:

    • 谢谢,它有效。只是想知道是否有某种方法可以做同样的事情,我不必从我创建的每个子小部件中发布事件?就像,只需在父框架(或其他地方)中定义一次,现在无论我添加多少子小部件,我仍然会在父小部件中获得 keydown 事件?
    • 除非有所改变,否则我认为没有。命令事件将自动传播到父小部件,但关键事件不是其中之一。请参阅groups.google.com/group/wxpython-users/browse_thread/thread/… 的讨论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2020-05-22
    • 2018-09-24
    • 2023-03-24
    • 1970-01-01
    • 2019-04-29
    相关资源
    最近更新 更多