重设 tkin 中的默认键绑定

2024-05-16 18:47:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将keybinding添加到我的根窗口(一个Tk()实例,其中包含一个文本小部件):

root.bind("Control-o", setconnpanelopen)

问题是control-o似乎在默认情况下被绑定为“insert newline”,这样我的过程就会被触发,但是它也会插入一个新行! 即使我在它的末尾放了一个return 'break',它也会发生这种情况,所以它看起来是在之前触发的。在

1)如何重新映射这种行为?在

2)我在任何地方都找不到默认的文本小部件keybindings的列表-它们在某处可用?在


Tags: 实例文本bind部件过程newline情况root
2条回答

你想了解一下“bindtags”tkinter的绑定机制。在

以“绑定”或“绑定”的顺序处理标记。例如,文本小部件有四个标记:小部件的标记、小部件类的标记(它是内部类名,而不是python类)、顶层窗口的标记和“all”的标记。在

大多数默认绑定都在类绑定上。这意味着您在小部件上创建的任何特定绑定都发生在默认绑定之前。在本例中,由于绑定到根窗口,所以绑定发生在之后。在

在任何时候,您都可以创建一个绑定来停止事件在bindtag链上的传播。通过从绑定中返回文本字符串"break"来实现这一点。因此,如果绑定在文本小部件本身上,则可以通过使setconnpanelopen返回{}来防止默认行为。由于原始绑定在根窗口上,这没有帮助,因为默认绑定发生在绑定之前。在

您有两种解决方案:一种,将绑定放在小部件上,而不是根窗口上。或者,将其保留在根窗口中,这样无论哪个小部件有焦点,它都会触发,然后向文本小部件添加一个绑定,该小部件只返回"break",以防止发生默认绑定。在

有关绑定的最终列表,请参见http://tcl.tk/man/tcl8.5/TkCmd/text.htm#M162这指向tcl/tk,但这正是tkinter的动力所在,它是tkinter文档的最终权威。在

创建从文本小部件继承的您自己的小部件。您也可以将回调函数作为小部件的一种方法。在

class MyTextWidget(Text):
    def __init__(self, master, **kw)
        Text.__init__(self, master, **kw)
        self.bind('<Control-O>', setconnpanelopen)

确保您的setconnpanelopen函数返回“break”。在

您可能想看看这个:http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

相关问题 更多 >