2012-01-03 11 views
5

में कीबोर्ड घटनाओं को कैप्चर करें। मैं wx.Frame के अंदर होने वाली कीबोर्ड घटनाओं को कैप्चर करने का प्रयास कर रहा हूं, और मैं निम्न कोडों को उन घटनाओं को कैप्चर करने की अपेक्षा करता हूं। हालांकि, हैंडलर OnKeyDown कहा जाता है कभी नहीं है जब मैं कोड चलाएँ:wxpython wx.frame

import logging as log 
import wx 

class MainWindow(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 

     self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 
     self.Bind(wx.EVT_KEY_UP, self.OnKeyDown) 
     self.Bind(wx.EVT_CHAR, self.OnKeyDown) 
     self.SetFocus() 
     self.Show(True) 

    def OnKeyDown(self, event=None): 
     log.debug("OnKeyDown event %s" % (event)) 

if __name__ == "__main__": 
    app = wx.App(False) 
    gui = MainWindow(None, "test") 
    app.MainLoop() 

किसी को ऐसा करने के तरीके हैं, मैं कुछ मदद की सराहना करेंगे।

उत्तर

3

यदि आप log.warning का उपयोग करते हैं तो आपका कोड काम करता है।

log.warning("OnKeyDown event %s" % (event)) 

लॉगिंग स्तर हैं:

Level Value 
CRITICAL 50 
ERROR  40 
WARNING 30 
INFO  20 
DEBUG  10 
UNSET  0 

डिफ़ॉल्ट लॉगिंग स्तर चेतावनी है। डिफ़ॉल्ट से अधिक स्तर के साथ केवल लॉग का उत्पादन किया जाता है। तो, डिफ़ॉल्ट स्तर पर (30), न तो log.info और न ही log.debug कोई आउटपुट उत्पन्न करता है।

संपादित ओपी के बाद टिप्पणी: स्थापना प्रवेश का सही स्तर अपने कोड winXP 32 बिट और 64 बिट Win7 पर सही काम करता है अजगर 2.6 और wxPython 2.8.11 और 2.8.12 के साथ बनाते हैं। हालांकि कोड किसी कारण से उबंटू पर काम नहीं करता है, मुझे नहीं पता। यह अंतर विभिन्न एसओ में wxwidgets को लागू करने के साथ ही लॉगिंग के साथ संबंधित है। जैसा कि आप पहले ही खोज चुके हैं, इसके लिए उबंटू में काम करने के लिए, इसे एक पैनल को जोड़ने के साथ-साथ पर्याप्त लॉगिंग स्तर के उपयोग की आवश्यकता है। तो यह काम करता है:

class MainWindow(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 
     self.panel = wx.Panel(self, wx.ID_ANY) 
     self.Bind(wx.EVT_KEY_DOWN, self.KeyDown) 
     self.Bind(wx.EVT_KEY_UP, self.KeyDown) 
     self.Bind(wx.EVT_CHAR, self.KeyDown) 
     self.panel.SetFocus() 

    def KeyDown(self, event=None): 
     logging.warning("OnKeyDown event %s" % (event)) 

if __name__ == "__main__": 
    app = wx.App(False) 
    gui = MainWindow(None, "test") 
    gui.Show() 
    app.MainLoop() 
+1

मैंने इस बदलाव को करने का प्रयास किया, और लॉगिंग पैकेज का उपयोग करने का भी प्रयास नहीं किया - बस प्रिंट करें। न तो परिवर्तन किया। – Kevin

+0

@ केविन, क्या आपका मतलब है कि आपके उत्तर में कोड काम करता है और आपके प्रश्न में से कोई एक या मेरा जवाब लॉगिंग को समाप्त नहीं करता है? आप क्या एसओ, पायथन और wxPython संस्करण का उपयोग कर रहे हैं? यह Win7 और winXP, पायथन 2.6, wxpython 2.8.11 और 2.8.12 – joaquin

+0

में परीक्षण किया गया है, मैं उबंटू 11.04 64 बिट का उपयोग कर रहा हूं, जैसा कि ऐसा लगता है कि आप पहले से ही कम कर चुके हैं। तो यह ओएस पर आधारित एक quirk है, लेकिन फ्रेम में पैनल जोड़ना एक आसान काम है। – Kevin

6

मुझे लगा कि मैं फ्रेम में एक पैनल जोड़ सकता हूं, और एक पैनल कुंजीपटल घटनाओं के अधिक ग्रहणशील है।

import wx 

class MainWindow(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 

     self.panel = wx.Panel(self, wx.ID_ANY) 
     self.panel.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 
     self.panel.Bind(wx.EVT_KEY_UP, self.OnKeyDown) 
     self.panel.Bind(wx.EVT_CHAR, self.OnKeyDown) 
     self.panel.SetFocus() 
     self.Show(True) 

    def OnKeyDown(self, event=None): 
     print "Event!" 

if __name__ == "__main__": 
    app = wx.App(False) 
    gui = MainWindow(None, "test") 
    app.MainLoop() 
+0

@ जॉक्विन: सुनिश्चित नहीं है कि * संवेदनशीलता * सर्वोत्तम शब्द है, लेकिन यह एक अच्छा जवाब है। मुझे उबंटू पर भी यही समस्या थी, 'wx.frame' के साथ महत्वपूर्ण घटनाओं को कैप्चर नहीं कर सका। 'Setxocus()' के साथ 'wx.Panel' को जोड़कर इस मुद्दे को हल किया गया। – shinjin