2011-06-14 86 views

回答

3

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

謝謝,它的工作原理。只是想知道是否有某種方法可以讓我做同樣的事情,而不必從我創建的每個小孩小部件中提取出來?就像,只是在父框架(或其他地方)中定義一次,現在無論添加多少個子部件,我仍然會在父部件中獲得keydown事件? – 2011-06-15 13:06:12

+0

除非有什麼改變,我不認爲有。命令事件會自動傳播到父窗口小部件,但是關鍵事件不是其中之一。請參閱http://groups.google.com/group/wxpython-users/browse_thread/thread/b63a9893ad8bbc3d/4dc2c2eed8a2ca4f?lnk=gst&q=Key+event+propagation+changed+in+2.8#4dc2c2eed8a2ca4f上的討論 – 2011-06-15 13:57:40

相關問題