我想将事件(一个用于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())
然而,这似乎不起作用。有没有适当的解决方案呢? (我也尝试了绑定方法同样缺乏结果)
答案 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)