0

根据 Effbot 的 Tkinterbook on Events and Bindings,我可以通过以下代码防止换行符插入到 Text 小部件中:

text.bind("<Return>", lambda e: "break")


这确实有效,但它阻止了<Return>事件到达父表单,父表单具有自己的<Return>绑定,可以在 Text 小部件和其他小部件上执行工作。我想要做的是在 Text 小部件中捕获诸如<Return>,<KP_Enter>等事件并防止插入换行符,但我仍然希望该事件向上传播。我找不到这样做的好方法,因为 Text 小部件没有像 Entry 小部件那样的验证形式(这是通常完成此类工作的地方)。

我在想,如果我覆盖<KeyPress>并检查event.keycode13我可以跳过内部调用::tk::TextInsert,而是调用 Tk 内部的任何函数,该函数负责将事件传递到绑定标签中的下一个元素,基于读取text.tclPython 中的 TCL 代码。

4

1 回答 1

2

你提到了绑定标签,听起来你知道它们是什么。但是,您还谈到了传播到其“父形式”的事件,而这些事件通常不会传播。事件传播到其父级的唯一时间<return>是父级是否在绑定标签中。如果父窗口是根窗口,这将是正确的,但对于任何其他窗口都不是,除非您将父窗口显式添加到绑定标签。

当您return "break"在绑定中执行此操作时,您会阻止其他绑定标签对事件进行操作。无法跳过紧接前面的绑定标签,但允许其他绑定标签处理事件。而且,没有办法(除非重新生成事件)让其他不属于绑定标签的小部件处理事件。

如果您在框架上有一个绑定,并且在文本小部件上有一个绑定,并且您希望两者都触发,则只需让您的文本小部件绑定调用与另一个绑定关联的代码。例如:

self.parent.bind("<Return>", self.validate_form)
Self.text.bind("<Return>", self.validate_form)

如果self.validate_form返回“break”,这应该可以按您的预期工作。

于 2013-09-13T12:48:50.037 回答