Wxpython 将子窗口小部件的关键事件重定向到其父框架窗口小部件

Wxpython 将子窗口小部件的关键事件重定向到其父框架窗口小部件,wxpython,Wxpython,是否有某种方法可以将所有子部件的关键事件重定向到wxpython中其父帧的关键事件,以便在单个方法中捕获所有关键事件?您的子类只需使用wx.PostEvent将事件与父部件一起作为目标发布即可。然后,您的父窗口小部件可以将事件绑定到其事件处理程序。如果需要知道事件来自哪个小部件,可以对事件调用GetName()。这里有一个小例子 import wx class ChildWidget(wx.TextCtrl): def __init__(self, parent, name, pos

是否有某种方法可以将所有子部件的关键事件重定向到wxpython中其父帧的关键事件,以便在单个方法中捕获所有关键事件?

您的子类只需使用
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()

您的子类只需要使用
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事件?除非发生了变化,否则我认为不会有。命令事件将自动传播到父窗口小部件,但键事件不是其中之一。请参阅“谢谢”上的讨论,它很有效。我只是想知道是否有某种方法可以让我做同样的事情,而不必从我创建的每个子部件中发布事件?比如,只需在父框架(或其他地方)中定义一次,现在无论我添加了多少子小部件,我仍然会在父小部件中获得keydown事件?除非发生了变化,否则我认为不会有。命令事件将自动传播到父窗口小部件,但键事件不是其中之一。请参阅上的讨论