猿问

在python中使用参数动态设置回调

我正在尝试通过以列表形式存储的一组数据在tkinter中动态构建一些按钮。我无法解决的事情是如何在回调函数中添加参数。由于回调中的代码要等到回调时间才执行,因此此时回调中使用的变量已更改值。


这是(非常)简化的代码版本:


from Tkinter import *

from ttk import *


mylist = ['a','b','c','d','e']



class App:


    def __init__(self, master):


        self.frame = Frame(master)

        self.frame.pack()


        for i in range (0,len(mylist)):

            setattr(self, 'button' + str(i), Button(self.frame, text=mylist[i], command= lambda: self.buttoncall(i)))

            getattr(self, 'button' + str(i)).pack(side=LEFT)


    def buttoncall(self,input):

        print mylist[input]


root = Tk()


app = App(root)


root.mainloop()


慕侠2389804
浏览 220回答 1
1回答

皈依舞

为以下项设置默认值i:command=lambda i=i: self.buttoncall(i)当不带任何参数调用回调时,的默认值i将绑定到本地变量i。由于默认值在定义lambda时是固定的,因此的值i将是所需的值。如果没有默认值i,则在调用回调时,i它不是局部变量。取而代之的是i,Python在封闭范围内找到的值。但是,到回调调用时,回调for-loop已经完成,i并且等于len(mylist)-1。因此,所有回调都使用的相同值i。
随时随地看视频慕课网APP

相关分类

Python
我要回答