поймать события key / char TextCtrl и переслать набранный ключ в стандартный поток подпроцесса - PullRequest
0 голосов
/ 03 февраля 2011

Я пытаюсь использовать 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", символы, цифры и т. Д., Все события ввода с клавиатуры на стандартный ввод, не позволяя TextCtrl вмешиваться.Есть ли хороший способ сделать это?Или я должен точно сопоставить каждый ключ один за другим?

Спасибо за любые предложения!

1 Ответ

0 голосов
/ 31 марта 2011

Вы можете сделать это, чтобы преобразовать код ключа в символ:

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. Они включают / отключают захват клавиш ввода и ввода в виде текста.

...