1

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

你看这里有什么不对吗?一定有什么我做错了。

4

1 回答 1

3

显然,您的代码存在两个问题:

  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将插入点移动到末尾可以很好地完成这项工作。所以,除了前面提到的代码,还要写:

# Somewhere in __init__:
    self.rich.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)

def onKeyDown(self, event):
    self.rich.SetInsertionPointEnd()
    event.Skip()

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

于 2009-03-08T09:00:18.190 回答