抓住TextCtrl的键/字符事件和转发键入的子进程stdin

问题描述:

我想使用wx.TextCtrl来捕获键入的键事件,并直接将键入的键转发到子进程的标准输入。请注意,为了我的特殊目的,我会 完全禁用TextCtrl的文本编辑功能。即当我输入一个字母 这个字母不会出现在TextCtrl上时,它将被直接转发。
下面是一些代码来说明我想要的。抓住TextCtrl的键/字符事件和转发键入的子进程stdin

# inside the main frame 
    self.text = wx.TextCtrl(self.panel, wx.ID_ANY, style=wx.TE_MULTILINE) 
    self.text.Bind(wx.EVT_KEY_DOWN, self.OnKey) 
    self.text.Bind(wx.EVT_CHAR, self.OnChar) 
# ... 

def OnKey(self, evt): 
    keycode = evt.GetKeyCode() 
    # ENTER 

    if keycode == 13: 
     self.subprocess.stdin.read("\n") 
    if keycode == 9: 
     self.subprocess.stdin.read("\t") 
    if keycode == 8: 
     self.subprocess.stdin.read("\b") 
    if keycode == 316: 
     pass # maybe some key will be ignored 
    else: 
     evt.skip() 

def OnChar(self, evt): 
    key=chr(keycode)     
    self.subprocess.stdin.read(key) 

我要转发“ENTER”键,“TAB”,“退格”,字符,数字等,所有的按键输入事件标准输入,而不让TextCtrl干涉。有没有一个好的方法来做到这一点?或者我必须一个接一个明确地匹配每个键?

感谢您的任何建议!

+0

如果你不想文本编辑,为什么使用TextCtrl? StaticText看起来更接近你想要的。 – ravenspoint 2011-02-10 13:37:48

你可以做到这一点的关键代码转换为字符:

chr(keycode) 

这不会得到一切不过,等进入和标签。你必须根据具体情况处理(如你在你的例子中所做的那样)。否则,你就需要创建的关键代码字典来字符映射:

codemap = {97:'a', 98:'b', 8:'\b'} # Fill this out 
self.subprocess.stdin.read(codemap[keycode]) 

您还可能希望与wx.TE_PROCESS_ENTER和wx.TE_PROCESS_TAB玩。它们启用/禁用以文本形式捕获输入和制表键。