2013-05-26 65 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