如何改变标位置wxRichTextCtrl在事件处理程序?
题
我有一个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)
你看到什么错误在这里?有必须是什么我做错了。
解决方案
显然,存在两个问题与你的代码:
你听上
EVT_KEY_DOWN
,这可能是处理之前EVT_TEXT
, 其默认的处理程序设置标的位置。你修改的
Caret
对象,而不是使用SetInsertionPoint
方法,这两个移动插入符和使下一个字出现在特定的地方。
这样的工作实例(I进行了测试,它可以作为你会喜欢它)将是:
# 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
对象,因此这个事件处理器知道是否停止传播事件之后,这种处理程序。
不隶属于 StackOverflow