2010-08-25 9 views
15

मैं किसी ईवेंट को टेक्स्टक्लर बॉक्स एनपी में जोड़ सकता हूं। समस्या यह है कि मुझे इस घटना को "पकड़ने" के लिए टेक्स्टक्टल बॉक्स के अंदर क्लिक करना होगा। मैं उम्मीद करता हूं कि मुख्य खिड़की पर ध्यान केंद्रित करते समय कोई भी तीर कुंजियों को दबाए रखने में सक्षम हो।WxPython में आप पूरी विंडो में EVT_KEY_DOWN ईवेंट कैसे बाध्य करते हैं?

काम नहीं कर रहा:

wx.EVT_KEY_DOWN(self, self.OnKeyDown) 

श्रमजीवी:

self.NudgeTxt = wx.TextCtrl(self.panel, size=(40,20), value=str(5)) 
wx.EVT_KEY_DOWN(self.NudgeTxt, self.OnKeyDown) 

मैं बहुत यकीन है कि मैं कुछ आसान याद आ रही हूँ। हालांकि थोड़ा फंस गया हूँ।

+0

क्षमा करें, आप टेक्स्ट बॉक्स में कुंजी डाउन इवेंट कैसे बाध्य करते हैं? यह वही है जो मुझे चाहिए! 'wx.EVT_KEY_DOWN (self.NudgeTxt, self.OnKeyDown) 'मेरे लिए काम नहीं कर रहा है – phunehehe

उत्तर

18

इसके बजाय .. wx.EVT_CHAR_HOOK

उदाहरण के लिए बाध्य करने की कोशिश

self.Bind(wx.EVT_CHAR_HOOK, self.onKey) 

    ... 

def onKey(self, evt): 
    if evt.GetKeyCode() == wx.WXK_DOWN: 
     print "Down key pressed" 
    else: 
     evt.Skip() 
+0

धन्यवाद वोल्टिंग। उसने ऐसा किया – ril3y

+0

@ ril3y: आपका स्वागत है! – volting

+0

इसने मेरी मुख्य विंडो को ईवेंट देखने की अनुमति दी, लेकिन मेरे बच्चे इसे नहीं देखते हैं। मेरे सभी हैंडलर में ईवेंट शामिल हैं। स्किप()। कोई सुझाव? – kjgregory

4

आप EVT_CHAR_HOOK इस्तेमाल कर सकते हैं,

self.Bind(wx.EVT_CHAR_HOOK, self.hotkey) 


def hotkey(self, event): 
    code = event.GetKeyCode() 
    if code == wx.WXK_LEFT: # or whatever... 
     ... 

या एक त्वरक तालिका

ac = [(wx.ACCEL_NORMAL, wx.WXK_LEFT, widget.GetId())] 
    tbl = wx.AcceleratorTable(ac) 
    self.SetAcceleratorTable(tbl) 
का उपयोग

आप n हूँ एक्सेलेरेटर टेबल में बटन या विजेट्स आईडी का उपयोग करने के लिए ईड, और बटन दबाकर विजेट्स इवेंट हैंडलर ट्रिगर करेगा।

आप कोई विजेट नहीं है, तो यह है कि आप अपने घटनाओं चाहें शुरू हो रहा है, और नहीं बल्कि घटना बाइंडिंग है कि "अदृश्य" विजेट किसी तरह का है, तो आप ऐसा कर सकते हैं होगा:

ac = [] 
    keys = [wx.WXK_LEFT, wx.WXK_RIGHT, wx.WXK_UP, wx.WXK_DOWN] 
    for key in keys: 
     _id = wx.NewId() 
     ac.append((wx.ACCEL_NORMAL, key, _id)) 
     self.Bind(wx.EVT_MENU, self.your_function_to_call, id=_id) 

    tbl = wx.AcceleratorTable(ac) 
    self.SetAcceleratorTable(tbl) 

मैं पुनरावृति इच्छुक कुंजी पर बाध्य करने के लिए, और उनके लिए नए विजेट आईडी बनाते हैं। मैं फिर इन आइटम्स का उपयोग मेनू आइटम को बाध्य करने के लिए करता हूं (जो त्वरक कुंजी ट्रिगर) और इन आईडी का उपयोग त्वरक तालिका की tuples की सूची में करें।