Python tkinter键绑定到所有后续小部件

时间:2017-07-29 20:49:55

标签: python tkinter

我想将事件(一个用于Ctrl + Z,一个用于Ctrl + Y)绑定到一个非常复杂的python tkinter表单(root有很多子帧,而且它们也有,所以将事件绑定到每个那些会非常烦人和冗余)。我希望有一种方法可以将键绑定到根目录,这样即使我的焦点位于子窗口小部件内部,绑定也会触发。到目前为止我尝试的是:

def _init_gui(self, root):
        """ Initializes all members of the gui"""
        tkinter.Frame.__init__(self, root) #Superclass init
        self.root = root
        width, height = root.winfo_screenwidth(), root.winfo_screenheight()

        #Most of the code is left out because it is not neccessary

        self.root.bind_all("Control-z", lambda _: self.undo())
        self.root.bind_all("Control-y", lambda _: self.redo())

然而,这似乎不起作用。有没有适当的解决方案呢? (我也尝试了绑定方法同样缺乏结果)

1 个答案:

答案 0 :(得分:1)

您没有正确指定活动。正确的事件名称为"<Control-z>""<Control-y>"(请注意<>)。

除此之外,bind_all正是您想要的。

也没有必要使用lambda。它仅在某种特定情况下有用,而且并非如此。只需提供一个函数的引用,该函数接受tkinter自动传递给回调的事件对象的参数。如果您还想直接调用该函数,请为event参数指定null默认值。

例如:

def undo(self, event=None):
    ...
def redo(self, event=None):
    ...

self.root.bind_all("<Control-y>", self.undo)
self.root.bind_all("<Control-z>", self.redo)