當你創建一個bind
結合,Tkinter的自動添加有關於事件的信息的參數。您需要在您的rand_func
定義或您如何調用它時說明該問題。
此參數是而不是包括在使用command
屬性時。你必須小心地考慮這個額外的論證,無論你在每種情況下如何調用函數,或者函數如何解釋其參數。
下面是一個解決方案,它在綁定中使用lambda
,只有在使用bind
命令時才接受附加事件,但不會將它傳遞給最終命令。
import tkinter as tk
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.frame = tk.Frame(self)
self.frame.pack()
self.button = tk.Button(self.frame, text="click me",
command=lambda a=1, b=2, c=3:
self.rand_func(a, b, c))
self.button.pack()
self.frame.bind("<Return>",
lambda event, a=10, b=20, c=30:
self.rand_func(a, b, c))
# make sure the frame has focus so the binding will work
self.frame.focus_set()
def rand_func(self, a, b, c):
print "self:", self, "a:", a, "b:", b, "c:", c
print (a+b+c)
app = SampleApp()
app.mainloop()
這就是說,綁定到一個框架是很正常的事情。通常情況下,一個框架不會有鍵盤焦點,並且除非它具有焦點,否則綁定將永遠不會觸發。如果您要設置全局綁定,則應綁定到「全部」綁定標記(使用方法bind_all)或綁定到頂層窗口小部件。
非常感謝,因爲你建議bind_all是我所需要的; –
需要注意的是,_a自動添加一個具有關於event_的信息的參數,僅適用於通過'bind'方法綁定的回調。用'command'選項(在構造函數中或用'configure()')綁定的那些不會收到這樣的事件對象。這種區別不容易在文檔中找到(至少我沒有找到任何),但這裏是[確認](https://stackoverflow.com/questions/36726716/what-is-the-difference-between-命令和綁定tkinter) –
@ o'rety:我已經更新瞭解決您的問題的答案。 –