Python 如何更改事件处理程序中wxRichTextCtrl的光标位置?
我的应用程序中有一个RichTextCtrl,它有一个处理程序,用于Python 如何更改事件处理程序中wxRichTextCtrl的光标位置?,python,events,wxpython,wxwidgets,Python,Events,Wxpython,Wxwidgets,我的应用程序中有一个RichTextCtrl,它有一个处理程序,用于EVT\u KEY\u DOWN。执行的代码如下所示: def move_caret(self): pdb.set_trace() self.rich.GetCaret().Move((0,0)) self.Refresh() def onClick(self,event): self.move_caret() event.Skip() rich是我的RichTextCtrl 以下
EVT\u KEY\u DOWN
。执行的代码如下所示:
def move_caret(self):
pdb.set_trace()
self.rich.GetCaret().Move((0,0))
self.Refresh()
def onClick(self,event):
self.move_caret()
event.Skip()
rich是我的RichTextCtrl
以下是我希望它能做的:
- 每次按键时,将按键添加到控件(这是默认行为)
- 将光标移动到控件开头的第一个位置
- 它将键添加到控件中
- 我检查了插入符号位置,调试器报告它位于0,0,但在控件上,它在当前位置闪烁(这是我按下键+1之前的位置)
你看到这里有什么不对劲吗?一定是我做错了什么。显然,您的代码有两个问题:
EVT_KEY_DOWN
上收听,这可能是在EVT_TEXT
之前处理的,其默认处理程序设置光标位置插入符号
对象,而不是使用SetInsertionPoint
方法,该方法可以移动插入符号并使下一个字符显示在给定位置# Somewhere in __init__:
self.rich.Bind(wx.EVT_TEXT, self.onClick)
def onClick(self, event):
self.rich.SetInsertionPoint(0) # No refresh necessary.
event.Skip()
编辑:如果希望文本添加到末尾,但光标保留在开头(请参见注释),可以利用这样一个事实,即
EVT\u KEY\u DOWN
在EVT\u text
之前处理(这反过来又在添加字符之后处理)。因此,事件的顺序是:
EVT\u键向下
EVT\u文本
EVT_KEY_DOWN
处理程序,在实际添加角色之前将插入点移动到末尾,这样做非常好。因此,除了前面提到的代码外,还要编写:
# Somewhere in __init__:
self.rich.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)
def onKeyDown(self, event):
self.rich.SetInsertionPointEnd()
event.Skip()
顺便说一下,
event.Skip()
不会立即调用下一个事件处理程序,它只是在event
对象中设置一个标志,以便事件处理程序知道是否在该处理程序之后停止传播事件。如果在onClick()中注释掉event.Skip(),会发生什么?或者,我会将一个小的工作示例发布到邮件列表中,让那些专家查看。如果我注释event.Skip(),则该字符不会附加到控件中。我希望该字符正常显示,而不是在位置0。之后,我想将插入符号移动到位置0。你能告诉我怎么做吗?我尝试先放置event.Skip,然后调用SetInsertionPoint,但我得到了相同的行为。