抓住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干涉。有没有一个好的方法来做到这一点?或者我必须一个接一个明确地匹配每个键?
感谢您的任何建议!
答
你可以做到这一点的关键代码转换为字符:
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玩。它们启用/禁用以文本形式捕获输入和制表键。
如果你不想文本编辑,为什么使用TextCtrl? StaticText看起来更接近你想要的。 – ravenspoint 2011-02-10 13:37:48