捕获WxPython样式文本控件的回车键

1 投票
4 回答
3883 浏览
提问于 2025-04-17 19:23

在wxpython中使用StyledTextControl,通过导入wx.stc,我该如何捕捉回车键的事件呢?我试过几种方法,但都出现错误或者根本不管用。

到目前为止,我写了:

self.text.Bind(wx.stc.STC_KEY_DOWN, self.hw)

def hw(self, event):
  if event.GetKeyCode == wx.stc.STC_KEY_RETURN:
    self.text.AddText('Hello World')
    event.Skip()

其中self.text是我的stc控件。

但对我来说似乎不太管用。我是应该使用wx的函数还是stc的函数来捕捉这个事件呢?

4 个回答

1

嗨,我知道这个问题有点旧了,但我用过这个方法,似乎有效。

import wx
import wx.stc

self.m_message = TextCtrl( self, ID_ANY, EmptyString, DefaultPosition, Size( 200,100 ), 0 )
self.m_message.Bind(EVT_KEY_DOWN, self.DoKeyPress)

def DoKeyPress(self, event):
    if event.GetKeyCode() == STC_KEY_RETURN:
        self.DoSendTextMessage(event)
    else:
        event.Skip()
1

你可以使用 wx.EVT_KEY_DOWN,而回车键的编号是13。

0

我认为在处理StyledTextCtrl的事件时,应该使用StyledTextCtrl的事件,而不是wx事件。

最明显的事件似乎是EVT_STC_KEY。不过,根据这个事件的文档,这可能并不好用:

Scintilla的文档说:

报告所有按下的键。因为在GTK+上有一些键盘焦点的问题,所以使用这个事件。Windows版本不会发送这个事件。

根据作者的理解,这意味着虽然在wxWindows中技术上可以使用这个事件,但实际上它是不会发生的。

你可以尝试处理EVT_STC_CHARADDED事件,但这个事件似乎是在添加新行后才会被调用。对于这个事件,调用event.Skip()没有任何效果。在Windows上,这个事件会触发两次,一次是回车\r,一次是换行\n

最终,你想要实现的功能可能是无法做到的。

(顺便提一下,STC_KEY_DOWN是表示向下箭头键的代码,而不是表示某个键被按下。)

撰写回答