【问题标题】:catch TextCtrl's key/char events and forward typed key to the stdin of a subprocess捕获 TextCtrl 的键/字符事件并将键入的键转发到子进程的标准输入
【发布时间】:2011-02-03 14:19:44
【问题描述】:

我正在尝试使用 wx.TextCtrl 来捕获键入的键事件,并将键入的键直接转发到子进程的标准输入。请注意,为了我的特殊目的,我会 完全禁用 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)

我想将“ENTER”、“TAB”、“BACKSPACE”、字符、数字等,所有的按键输入事件转发到stdin,不让TextCtrl干扰。有什么好的方法吗?或者我必须一个一个地明确匹配每个键?

感谢您的任何建议!

【问题讨论】:

  • 如果你不想编辑文本,为什么要使用TextCtrl? StaticText 似乎更接近您想要的。

标签: python user-interface wxpython wxwidgets keyboard-events


【解决方案1】:

您可以这样做将键码转换为字符:

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。它们启用/禁用将 enter 和 tab 键捕获为文本。

【讨论】:

    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多