我的应用程序中有一个RichTextCtrl,它有一个EVT_KEY_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
之前处理,其默认处理程序设置光标位置。修改
Caret
对象,而不是使用SetInsertionPoint
方法,它既移动了插入符号,又使下一个字符出现在给定的位置。因此,工作示例(我测试了它,它可以按照您的要求工作)是:
编辑:如果您希望在末尾添加文本,但光标保留在开始位置(参见注释),可以利用这样一个事实,即
EVT_KEY_DOWN
是在EVT_TEXT
之前处理的(这又是在字符添加之后处理的)。所以事件的顺序是:EVT_KEY_DOWN
EVT_TEXT
添加一个
^{pr2}$EVT_KEY_DOWN
的处理程序,它在实际添加字符之前将插入点移动到末尾,这样做非常好。因此,除了前面提到的代码外,还要写下:顺便说一句,
event.Skip()
不会立即调用下一个事件处理程序,它只是在event
对象中设置一个标志,以便事件处理器知道是否在该处理程序之后停止传播事件。在相关问题 更多 >
编程相关推荐