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

Posted

技术标签:

【中文标题】捕获 WxPython 样式文本控件的回车键【英文标题】:Capturing enter key for WxPython Styled Text Control 【发布时间】:2013-03-17 11:38:13 【问题描述】:

通过导入wx.stc 在 wxpython 中使用 StyledTextControl,我如何将 Enter 键捕获为事件?我尝试了几种方法,但似乎都说错误或根本不起作用。

我太公平了:

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 函数来捕获事件?

【问题讨论】:

【参考方案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()

【讨论】:

这对我不起作用,您必须编写 wx.EVT_KEY_DOWN 和 wx.stc.STC_KEY_RETURN 才能使此代码起作用。【参考方案2】:

这实际上在文档中进行了解释:https://wxpython.org/Phoenix/docs/html/wx.TextCtrl.html。将样式设置为 TE_PROCESS_ENTER 将启用事件,然后您可以绑定它。

from wx import TextCtrl, EVT_TEXT_ENTER, TE_PROCESS_ENTER
text_input = TextCtrl(parent, style=TE_PROCESS_ENTER)
text_input.Bind(EVT_TEXT_ENTER, callback)

【讨论】:

【参考方案3】:

我认为您应该使用 StyledTextCtrl 事件来处理 StyledTextCtrl 中的事件,而不是 wx 事件。

要处理的最明显的事件似乎是EVT_STC_KEY。但是,根据documentation for the event,这可能行不通:

Scintilla 文档说:

Reports all keys pressed. Used on GTK+ because of some problems with keyboard focus. Not sent by Windows version.

据作者所知,这意味着该事件虽然在技术上可通过 wxWindows 获得,但实际上永远不会发生。

您可以尝试处理 EVT_STC_CHARADDED 事件,但这似乎是在添加新行后调用的。为此事件调用event.Skip() 无效。在 Windows 上,此事件会触发两次,一次用于回车符\r,一次用于换行符\n

最终,您尝试实现的目标可能无法实现。

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

【讨论】:

【参考方案4】:

你可以使用wx.EVT_KEY_DOWN,回车键是13

【讨论】:

以上是关于捕获 WxPython 样式文本控件的回车键的主要内容,如果未能解决你的问题,请参考以下文章

wxpython - 擦除背景擦除非背景组件

MFC对话框的CEdit控件回车换Tab键,并获得焦点全选中文本

常见控件测试点

javascript 文本框中,判断回车键触发事件 兼容IE&FireFox

当用户在文本框中按下回车键时如何不关闭表单

如何从 wxPython 中的文本控件传递突出显示的文本