English 中文(简体)
如何在事件处理程序中更改wxRichTextCtrl的光标位置?
原标题:
  • 时间:2009-03-07 20:18:27
  •  标签:

我在我的应用程序中有一个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)。

你看到这里有什么问题吗?我一定做错了什么。

最佳回答

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

  1. 你要监听 EVT_KEY_DOWN,这个事件可能比 EVT_TEXT 先处理,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处理的事实(而EVT_TEXT在字符添加后处理)。所以事件的顺序是:

  1. handle EVT_KEY_DOWN
  2. add character at current insertion point
  3. handle 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 对象中设置一个标记,以便事件处理器知道在此处理程序之后是否停止传播事件。

问题回答

暂无回答




相关问题
热门标签