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

时间:2009-03-07 20:18:27

标签: python events wxpython wxwidgets

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

你觉得这里有什么问题吗?肯定有一些我做错了。

1 个答案:

答案 0 :(得分:3)

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

  1. 你在EVT_KEY_DOWN上听,这可能是在EVT_TEXT之前处理的,其默认处理程序设置了光标位置。

  2. 您可以修改Caret对象,而不是使用SetInsertionPoint方法,它会移动插入符并使下一个字符显示在给定位置。

  3. 因此,工作示例(我测试了它并且它可以按照您的意愿工作)将是:

    # 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
    4. 添加一个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>