gpt4 book ai didi

python - 为什么在此示例中需要 lambda 表达式? (Python)

转载 作者:行者123 更新时间:2023-11-28 21:51:40 25 4
gpt4 key购买 nike

<分区>

我正在用 Python 学习一点 Tkinter,创建交互式窗口。我目前正在制作的窗口是这样一个窗口,给定一个联系人字典及其各自的联系信息,为每个联系人创建一个按钮,当按下该按钮时,会显示他们的联系信息。

我的两个示例联系人名为“Marvin”和“Minsky”,他们的信息存储在名为 book 的字典中:

import Tkinter as tkinter

# 'Phonebook' with contact info for two people.
book = {"Marvin": {"Mobile": "1234567890", "Email": "marvin@gmail.com"},
"Minsky": {"Mobile": "9087865342", "Email": "minsky@yahoo.com"}}

window = tkinter.Tk() # Make window object

def showinfo(name):
# Displays info for person whose button was clicked

# Displays info by configuring labels named 'mobile' and 'email',
# using values in 'book'
mobile.configure(text = book[name]["Mobile"])
email.configure(text = book[name]["Email"])

这里是重要的部分。不是简单地使用 command = showinfo(name) 来调用 showinfo() 的按钮,就像我首先尝试过,使用了 lambda 表达式:

for name in sorted(phonedict.book.keys()): 
# Create button for each alphabetically sorted name
btn = tkinter.Button(text = name, command = lambda arg = name: showinfo(arg))
btn.pack()

剩下的代码只是showinfo()修改的标签:

# Window section where contact info is displayed via labels
mobile_lbl = tkinter.Label(text = "Mobile:")
mobile_lbl.pack()
mobile = tkinter.Label(text = "")
mobile.pack()
email_lbl = tkinter.Label(text = "Email:")
email_lbl.pack()
email = tkinter.Label(text = "")
email.pack()

# Display window
window.mainloop()

运行时,该程序完全按照我的要求执行,在单击每个按钮时正确修改标签。

如果 command = showinfo(name) 被用来代替 lambda,然而,NameError: global name 'mobile' is not defined 被抛出是因为(我认为) 它会尝试在创建按钮时而不是在按下 时执行按钮的命令。

为什么在按钮的命令中使用 lambda 表达式会阻止命令在单击按钮之前执行?它有什么功能用途?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com