我的应用程序中有一个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()
富是我的RichTextCtrl。
以下是我希望它做的事情:
在每次按键时,将键添加到控件(这是默认行为)
将光标移动到控件的开头,第一个位置
以下是它的实际作用:
它添加了控件的键
我检查了插入位置,调试器报告它位于0,0但是在控件上,它在当前位置闪烁(这是我按下键+ 1之前的位置)
< / LI>你觉得这里有什么问题吗?肯定有一些我做错了。
答案 0 :(得分:3)
显然,您的代码存在两个问题:
你在EVT_KEY_DOWN
上听,这可能是在EVT_TEXT
之前处理的,其默认处理程序设置了光标位置。
您可以修改Caret
对象,而不是使用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_KEY_DOWN
这一事实在EVT_TEXT
之前处理(在添加字符后处理)。所以事件的顺序是:
EVT_KEY_DOWN
EVT_TEXT
添加一个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
对象中设置一个标志,以便事件处理器知道是否在此处理程序之后停止传播事件。 / p>