gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:01:02 26 4
gpt4 key购买 nike

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

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

最佳答案

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

  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_DOWNEVT_TEXT 之前处理(而 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 对象中设置一个标志,以便事件处理器知道是否在此处理程序之后停止传播事件。

关于python - 如何在事件处理程序中更改wxRichTextCtrl的光标位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/622417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com