如何在事件处理程序中更改wxRichTextCtrl的光标位置?

2024-10-02 16:31:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我的应用程序中有一个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之前的位置)

你觉得这里有什么不对劲吗?一定是我做错了什么。在


Tags: key代码selfevent应用程序处理程序movedef
1条回答
网友
1楼 · 发布于 2024-10-02 16:31:37

显然,你的代码有两个问题:

  1. 您监听EVT_KEY_DOWN,它可能在EVT_TEXT之前处理,其默认处理程序设置光标位置。

  2. 修改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之前处理的(这又是在字符添加之后处理的)。所以事件的顺序是:

  1. 句柄EVT_KEY_DOWN
  2. 在当前插入点添加字符
  3. 句柄EVT_TEXT

添加一个EVT_KEY_DOWN的处理程序,它在实际添加字符之前将插入点移动到末尾,这样做非常好。因此,除了前面提到的代码外,还要写下:

^{pr2}$

顺便说一句,event.Skip()不会立即调用下一个事件处理程序,它只是在event对象中设置一个标志,以便事件处理器知道是否在该处理程序之后停止传播事件。在

相关问题 更多 >