【发布时间】:2015-06-30 12:52:35
【问题描述】:
我正在学习一点 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"])
这是重要的部分。我第一次尝试使用 lambda 表达式,而不是简单地使用 command = showinfo(name) 调用 showinfo() 的按钮:
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 表达式会阻止命令在单击按钮之前执行?它服务于什么功能目的?
【问题讨论】:
-
你曾经在非 Tkinter 项目中使用过 lambdas 吗?一些实验可能会揭示他们的行为。
-
这基本上是与stackoverflow.com/q/8269096/3001761相反的问题