2012-01-03 43 views
5

Tôi đang cố gắng nắm bắt các sự kiện bàn phím xảy ra bên trong wx.Frame và tôi sẽ mong đợi mã sau đây để nắm bắt các sự kiện đó. Tuy nhiên, trình xử lý OnKeyDown không bao giờ được gọi khi tôi chạy mã:các sự kiện bàn phím chụp wxpython trong một 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() 

Nếu có ai biết cách thực hiện việc này, tôi sẽ đánh giá cao một số trợ giúp.

Trả lời

3

Mã của bạn hoạt động nếu bạn sử dụng log.warning.

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

mức Logging là: mức độ khai thác gỗ

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

Giá trị mặc định là cảnh báo. Chỉ các bản ghi có mức cao hơn giá trị mặc định mới được tạo. Vì vậy, ở mức mặc định (30), không phải log.info cũng không phải log.debug tạo ra bất kỳ đầu ra nào.

Đã chỉnh sửa sau OP ý kiến ​​: Đặt mức ghi chính xác làm cho mã của bạn hoạt động hoàn hảo trên winXP 32bit và win7 64 bit với python 2.6 và wxpython 2.8.11 và 2.8.12. Tuy nhiên, mã không hoạt động trên ubuntu vì một lý do nào đó mà tôi không biết. Sự khác biệt này có liên quan với cách các wxwidgets được thực hiện trong các SO khác nhau nhưng không phải với việc ghi nhật ký. Như bạn đã phát hiện, để nó hoạt động trong ubuntu, nó cần một bảng điều khiển được thêm vào cũng như việc sử dụng mức ghi đầy đủ. Vì vậy, công trình này:

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

Tôi đã thử thực hiện thay đổi này và cũng đã thử không sử dụng gói ghi nhật ký - chỉ cần in. Không thay đổi. – Kevin

+0

@Kevin, bạn có nghĩa là mã trong câu trả lời của bạn hoạt động và câu hỏi trong câu hỏi của bạn hoặc câu trả lời của tôi không, thậm chí loại bỏ đăng nhập? Bạn đang sử dụng phiên bản SO, python và wxPython nào? Điều này được thử nghiệm trong win7 và winXP, python 2.6, wxpython 2.8.11 và 2.8.12 – joaquin

+0

Tôi đang sử dụng Ubuntu 11.04 64bit, vì có vẻ như bạn đã suy luận. Vì vậy, nó là một quirk dựa trên hệ điều hành, nhưng thêm bảng điều khiển vào khung là một công việc dễ dàng xung quanh. – Kevin

6

Tôi đã tìm ra rằng tôi có thể thêm bảng điều khiển vào khung và bảng điều khiển dễ tiếp thu hơn các sự kiện bàn phím.

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

@joaquin: Không chắc chắn nếu * độ nhạy * là thuật ngữ tốt nhất, nhưng đây là câu trả lời hay. Tôi đã có cùng một vấn đề trên Ubuntu, không thể nắm bắt các sự kiện quan trọng với một 'wx.Frame'. Thêm một 'wx.Panel' cùng với' SetFocus() 'vào nó đã giải quyết được vấn đề. – shinjin

Các vấn đề liên quan