2017-07-29 79 views
0

我想綁定到事件(一個用於Ctrl + Z和一個用於Ctrl + Y)到一個非常複雜的python tkinter窗體(根有很多子框架,如果將事件綁定到每個事件上會非常煩人和多餘)。我希望有一種方法將鍵綁定到根,這樣即使我的注意力集中在子部件上,綁定也會觸發。我到目前爲止所嘗試的是:Python tkinter鍵綁定到所有後續的小部件

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()) 

但是,這似乎並不奏效。有沒有適當的解決方案呢? (我也嘗試了bind-Method和結果相同的缺點)

+2

'bind'或'bind_all'應該爲這項工作。確保你在命令中使用了尖括號,並且lambda在這裏不需要:'self.root.bind(「」,self.undo)' – Novel

+0

謝謝你,愚蠢的我......然而lambda是需要的,因爲事件通過並且撤消和重做的簽名顯然不需要論證。 – PfannkuchenXD

+0

因此將其添加到簽名中。標準形式應該是'def undo(self,event = None):'以便它可以從綁定或通常調用。如果你想添加跟蹤調用它的能力:'def undo(self,* args):' – Novel

回答

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)