我有一个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, 其默认的处理程序设置标的位置。

  2. 你修改的 Caret 对象,而不是使用 SetInsertionPoint 方法,这两个移动插入符和使下一个字出现在特定的地方。

这样的工作实例(I进行了测试,它可以作为你会喜欢它)将是:

# 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 对象,因此这个事件处理器知道是否停止传播事件之后,这种处理程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top