处理 wxGrid 类中的返回键



最近我使用python 2.7和wx2.8作为应用程序的基础。从那时起,我在应用程序中处理返回键时遇到了问题。我只在 Windows 上有这个错误 - 在 linux 中它工作正常。将处理除"返回/小键盘返回"之外的所有键。我把wx.TE_PROCESS_TAB|wx.TE_PROCESS_ENTER|WX.WANTS_CHARS框架和网格上的样式。我尝试了 ON KEY DOWN 和 ON CHAR HOOK 事件 - 在帧和网格和网格渲染器上。我的回车钥匙在某处丢失了。尝试的解决方案来自:wxWidgets的EVT_CHAR_HOOK做什么?

https://groups.google.com/forum/#!topic/wxpython-users/1RaaGxu62q4(这就像对我的问题的完美描述,但失败了)

http://osdir.com/ml/python.wxpython/2004-03/msg00261.html

有什么想法吗?

问候话筒

wxPython版本之间似乎有一些不一致的地方。请尝试以下示例:

import wx
import wx.grid
class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        self.panel = wx.Panel(self)
        self.grid = wx.grid.Grid(self.panel)
        self.grid.CreateGrid(3, 3)
        self.grid.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        self.grid.Bind(wx.EVT_KEY_UP, self.OnKeyUp)
        self.grid.Bind(wx.EVT_CHAR_HOOK, self.OnChar)
        self.sizer = wx.BoxSizer()
        self.sizer.Add(self.grid, 1)
        self.panel.SetSizerAndFit(self.sizer)  
        self.Show()
    # You may or may not want to add e.Skip() to your RETURN key handling.
    # If you do not call e.Skip(), the event is not propagated to the widget.
    # Depends on your app logic if that is something you want or not.
    def OnKeyDown(self, e):      
        # Python 2.7, wxPython 2.8 - Works, but more like EVT_CHAR_HOOK
        # Python 3.3, wxPython Phoenix - Never shows up
        code = e.GetKeyCode()
        if code in [wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER]:
            print("Return key down")
        else:
            e.Skip() 
    def OnKeyUp(self, e):
        code = e.GetKeyCode()
        if code in [wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER]:
            print("Return key up")
        else:
            e.Skip() 
    def OnChar(self, e):
        # Python 2.7, wxPython 2.8 - Never shows up
        # Python 3.3, wxPython Phoenix - Works
        code = e.GetKeyCode()
        if code in [wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER]:
            print("Return key char")
        else:
            e.Skip() 

app = wx.App(False)
win = MainWindow(None)
app.MainLoop()

最新更新