这就是绑定的工作原理(这是一件好事),但您的问题很容易解决。
绑定按照小部件绑定标签(也称为绑定标签或绑定标签)指定的顺序触发。除非您另外指定,否则绑定按以下顺序发生:
- 如果小部件上直接有一个绑定,它将在任何其他绑定之前被触发。
- 如果小部件的类上有绑定,则接下来会触发它
- 如果包含该小部件的顶级小部件上存在绑定,则接下来会触发它(注意:在此上下文中根窗口被视为顶级窗口)
- 如果“all”上有绑定,那么接下来就会触发。
该序列可以在任何时候由事件处理程序之一停止,但这不是本次具体讨论的重点。
在默认情况下,您的绑定<Key>
发生在类绑定之前,并且正是类绑定将文本实际插入到小部件中。这就是为什么你的绑定似乎总是落后一个字符。
通常,这种顺序是完全正确的,因为更具体的绑定有机会覆盖默认行为。如果不是这样,即使您不想要,您也总是会得到默认行为。当您想要增强默认绑定而不是替换它们时,这并不总是您想要的。
您可以交换绑定标签的顺序,以便首先发生类绑定。或者,向文本小部件添加一个额外的绑定标签,并将其添加到类绑定之后的序列中,然后绑定到该标签。通常添加绑定标签是更好的解决方案,但并非总是如此。
要更改绑定标签,您可以执行以下操作:
self.inputText.bindtags(((str(self.inputText)), "Text", "post-insert", ".", "all"))
要绑定到“插入后”,请使用 bind_class 方法执行此操作:
self.inputText.bind_class("post-insert", "<Key>", self.translate)
这可能看起来很奇怪,但绑定标签是最强大的绑定机制之一。它们使您能够完全控制绑定的顺序,这对于任何其他工具包来说要困难得多。
顺便说一句,不要忘记,如果您将所有字符都放在文本小部件的末尾,那么末尾总会有一个额外的换行符。要么到达end-1c
,或从文本中删除一个换行符。