Tkinter lambda 函数
Posted
技术标签:
【中文标题】Tkinter lambda 函数【英文标题】:Tkinter lambda function 【发布时间】:2012-06-15 20:25:53 【问题描述】:(正如“家庭作业”标签所示,这是计算机科学中一个大项目的一部分。)
我正在使用 tkinter 在 Python 中编写 Jeopardy! 模拟,我在按钮中使用 lambda 函数时遇到了一个大问题。假设root = Tk()
和categories
是一个列表。
# Variable to keep the buttons
root._buttons =
# Display headers on top of page
for i in range(5):
# Get category name for display in main window
name = categories[i]
b = Label(root, text=fill(name.upper(), 10), width=18, height=3,\
bg="darkblue", fg="white", font=("Helvetica bold", "", 11))
b.grid(row=0, column=i)
# Create list of buttons in that variable (root._buttons)
btnlist = [None]*5
# Display individual questions
for j in range(5):
# Make a button for the question
b = Button(root, text="$" + str(200 * (j+1)), width=8, height=1,
bg="darkblue", fg="orange", font=("Impact", "", 30))
b.cat = name
b.value = 200 * (j + 1)
b.sel = lambda: select(b.cat, b.value)
# Add callback event to button
print(b.cat, b.value, b.sel)
b.config(command=b.sel)
# Add button to window
b.grid(row=j+1, column=i)
# Append to list
btnlist[j] = b
root._buttons[categories[i]] = btnlist
所有代码见my little Code Viewer (under construction!)
问题似乎出现在lambda: select(b.cat, b.value)
,因为当我单击板上的任何按钮时,它总是转到板上的最后一个按钮。我尝试过其他方法,不幸的是都使用lambda
,我还没有看到任何不涉及lambda
的方法。
【问题讨论】:
这能回答你的问题吗? Python Lambda in a loop 【参考方案1】:改变
lambda: select(b.cat, b.value)
到
lambda b = b: select(b.cat, b.value)
在您的原始代码中,b
不是lambda
的局部变量;它位于封闭范围内。一旦for-loop
完成,b
将保留它的最后一个值。这就是为什么lambda
函数都使用最后一个按钮的原因。
如果您定义 lambda 以采用一个带有默认值的参数,则默认值在 lambda 被定义时确定(并固定)定义。现在b
是lambda
的一个局部变量,当不带参数调用lambda 时,Python 将b
设置为默认值,该默认值可以根据需要设置为各种不同的按钮。
【讨论】:
我已经被这个特殊问题困扰了 3 天了。连我的老师都想不通。非常感谢!!【参考方案2】:如果您将 lambda 表达式替换为函数工厂,它会让您更具表现力。 (假设您要多次调用它)。这样你就可以在以后进行分配、添加更复杂的逻辑等,而不必处理 lambda 的限制。
例如:
def button_factory(b):
def bsel():
""" button associated with question"""
return select(b.cat, b.value)
return bsel
给定输入 b
,button_factory
返回一个可使用 ()
调用的函数,该函数返回您想要的内容。唯一的区别是你可以做作业等。
尽管最初可能会占用更多代码行,但它会在以后为您提供更大的灵活性。 (例如,您可以将计数器附加到 bsel 并能够计算特定问题被选中的次数等)。
它还有助于自省,因为您可以让每个文档字符串清楚地识别它与哪个问题相关联,等等。
【讨论】:
我试过你的解决方案,效果很好,但它不在我的课程范围内,所以我不能真正使用它。但是,我也使用lambda
尝试了@unutbu 的解决方案。还是谢谢!以上是关于Tkinter lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章
python tkinter, 通过lambda表达式传递参数到按钮的点击事件函数