捕获WxPython样式文本控件的输入键

时间:2013-03-17 11:38:13

标签: python wxpython scintilla

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

4 个答案:

答案 0 :(得分:2)

嗨,我知道现在有点老了,但我用过它,似乎有效。

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 :(得分:0)

我相信你应该使用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是代表向下箭头键的代码,而不是按下键的代码。)

答案 2 :(得分:0)

您可以使用wx.EVT_KEY_DOWN,返回键为13

答案 3 :(得分:0)

实际上在文档中解释了这一点: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)