2011-09-04 25 views
6

我有一個Tkinter的框架和附着於一個按鈕:Tkinter的結合與參數的函數到窗口小部件

from tkinter import * 

def rand_func(a,b,c,effects): 
    print (a+b+c) 

root=Tk() 
frame=Frame(root) 
frame.bind("<Return>",lambda a=10, b=20, c=30: rand_func(a,b,c)) 
frame.pack() 

button=Button(frame, text="click me", command=lambda a=1,b=2,c=3,eff=None:rand_func(a,b,c)) 
button.pack() 

root.mainloop() 

我想,當用戶按下ENTER鍵來完成同樣的功能,當他按下按鈕。可悲的是,上面的代碼在幀綁定時出錯。有誰知道這個問題的解決方案?

回答

12

當你創建一個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)或綁定到頂層窗口小部件。

+0

非常感謝,因爲你建議bind_all是我所需要的; –

+0

需要注意的是,_a自動添加一個具有關於event_的信息的參數,僅適用於通過'bind'方法綁定的回調。用'command'選項(在構造函數中或用'configure()')綁定的那些不會收到這樣的事件對象。這種區別不容易在文檔中找到(至少我沒有找到任何),但這裏是[確認](https://stackoverflow.com/questions/36726716/what-is-the-difference-between-命令和綁定tkinter) –

+1

@ o'rety:我已經更新瞭解決您的問題的答案。 –

1

如何:

from Tkinter import * 

def rand_func(eff=None,a=1,b=2,c=3): 
    print (a+b+c) 

root=Tk() 
root.bind("<Return>",lambda eff:rand_func(eff,a=10,b=20,c=30)) 

frame=Frame(root) 
frame.pack() 

button=Button(frame, text="click me", command=lambda:rand_func(None,1,2,3)) 
button.pack() 

root.mainloop() 
+0

忘記在代碼中寫入的參數是不同的,編輯問題 –

相關問題