【问题标题】:How to change cursor position of wxRichTextCtrl in event handler?如何在事件处理程序中更改 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()

rich 是我的 RichTextCtrl。

这是我想做的:

  • 在每次按键时,将按键添加到控件(这是默认行为)

  • 将光标移动到控件的开头,第一个位置

这是它的实际作用:

  • 它将键添加到控件中

  • 我检查了插入符号的位置,调试器报告它位于 0,0 但在控件上,它在当前位置闪烁(这是我按下键 + 1 之前的位置)

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

【问题讨论】:

  • 如果在 onClick() 中注释掉 event.Skip() 会发生什么?或者,我会将一个小的工作示例发布到邮件列表中,让那些专家查看它。
  • 如果我注释 event.Skip(),字符不会被附加到控件中。

标签: python events wxpython wxwidgets


【解决方案1】:

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

  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()

编辑:如果您希望将文本添加到末尾,但光标保留在开头(请参阅 cmets),您可以利用处理 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 对象中设置一个标志,以便事件处理器知道在此处理程序之后是否停止传播事件。

【讨论】:

  • 我希望角色正常出现,而不是在位置 0。我想将插入符号移动到位置 0 之后。你能告诉我怎么做吗?我尝试先放置 event.Skip,然后再调用 SetInsertionPoint,但我得到了相同的行为。
猜你喜欢
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
相关资源
最近更新 更多