【问题标题】:Dynamically setting callbacks with arguments in python在python中使用参数动态设置回调
【发布时间】:2013-05-21 16:01:37
【问题描述】:

我正在尝试根据以列表形式存储的一组数据在 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()

【问题讨论】:

标签: python


【解决方案1】:

i设置一个默认值:

command=lambda i=i: self.buttoncall(i)

当不带参数调用回调时,i 的默认值将绑定到局部变量 i。由于在定义 lambda 时默认值是固定的,因此 i 的值将是所需的值。

没有i的默认值,当回调被调用时i不是一个局部变量。相反,Python 在封闭范围内查找 i 的值。然而,当回调被调用时,for-loop 已经完成并且i 等于len(mylist)-1。所以所有的回调都使用相同的i值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2020-05-13
    • 2020-07-12
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多