捕获TextCtrl的键/字符事件并将输入键转发给子进程的stdin
我正在尝试使用 wx.TextCtrl 来捕捉用户输入的按键事件,并将这些按键直接转发到一个子进程的标准输入(stdin)。需要注意的是,出于我的特殊需求,我会完全禁用 TextCtrl 的文本编辑功能。也就是说,当我输入一个字母时,这个字母不会出现在 TextCtrl 上,而是会直接被转发。
以下是一些代码,来说明我想要实现的功能。
# 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)
我想将“回车”、“制表符”、“退格键”、字符、数字等所有的按键输入事件转发到标准输入,而不让 TextCtrl 干扰这个过程。有没有好的方法可以做到这一点?还是说我必须逐个匹配每个按键?
感谢任何建议!
1 个回答
0
你可以这样做,把按键代码转换成字符:
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。这两个选项可以开启或关闭将回车键和制表键当作文本来处理。