2013-05-26 111 views
1

如何從函數訪問top level widget,該函數用作按鈕或菜單的命令?有一種方法可以通過使用command=lambda: f(params)在此命令功能中添加參數,但我認爲它可能更容易。訪問Tkinter中的頂級小部件

回答

3

你可以使用lambda,像你提到的:

command=lambda: f(params) 

或者你可以做一個封閉:

def make_callback(params): 
    def callback(): 
     print(params) 
    return callback 
params = 1,2,3 
button = tk.Button(master, text='Boink', command=make_callback(params)) 

,或者你可以使用一個類,並通過綁定方法。 self的屬性可以包含您必須作爲參數傳遞的信息。

import Tkinter as tk 
class SimpleApp(object): 
    def __init__(self, master, **kwargs): 
     self.master = master 
     self.params = (1,2,3) 
     self.button = tk.Button(master, text='Boink', command=self.boink) 
     self.button.pack() 
    def boink(self): 
     print(self.params) 

root = tk.Tk() 
app = SimpleApp(root) 
root.mainloop() 
+0

你的lambda和你的顯式def都是閉包。 – abarnert

+0

lambda本身不是一個閉包,因爲它不會關閉'params'。 – unutbu

+1

當且僅當在創建函數時'params'處於非全局範圍內時''lambda'是一個閉包。 「def」也是如此。嘗試用'def command():return f(params)'替換'command = lambda:f(params)',並嘗試用'return lambda:f(params)'替換'make_callback'的主體。 – abarnert