我想按下面的一个按钮时更新孩子的名字。使用这个lambda函数,无论按下哪个按钮,我总是得到姓氏。是否可以使用lambda函数修复它?据我所知,lambda函数适用于定义值,但我没有看到任何带变量的例子。我该如何解决?谢谢,
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#------------------------------------------------------------
__title__= 'Control'
__date__ = '10/07/2017'
__version__ = '0.0.1'
from tkinter import *
from tkinter import ttk
class Panel():
def __init__(self, database, name):
self.root = Tk()
self.root. title('Control V' + __version__)
self.root.configure(bg='beige')
self.window = ttk.Frame(self.root, borderwidth=2, relief="raised",
padding=(10,10))
self.window.grid(column=0, row=0)
self.window.option_add("*Font", "Helvetica 12")
# Row 0
self.header = ttk.Label(self.window, text=name, padding=(1,1),
anchor='center')
self.header.grid(row=0, column=0, columnspan=3)
# Row 1
for col, record in enumerate(database, 0):
name = database[col]['Letter']
label = ttk.Button(self.window, text=name,
command=lambda *args: self.get_name(col, database))
label.grid(row=1, column=(col), sticky='ew')
# All set
self.root.mainloop()
def get_name(self, row, database):
name = database[row]['Name']
self.header.configure(text=name)
def main():
database = [
{'Letter': 'A', 'Name': 'Zara'},
{'Letter': 'B', 'Name': 'Ezra'},
{'Letter': 'C', 'Name': 'Amy'},
]
name = database[0]['Name']
my_panel = Panel(database, name)
return 0
if __name__ == '__main__':
main()
答案 0 :(得分:0)
如果将get_name更改为curried函数:
def get_name(row, database):
name = database[row]['Name']
def _get_name():
self.header.configure(text=name)
return _get_name
并用此返回的函数替换命令声明:
label = ttk.Button(self.window, text=name,
command=self.get_name(col, database))
结果与预期一致。
(这样做的目的是在创建按钮时定义按钮单击的返回值,而不是稍后尝试传入参数。原始代码的所有按钮都依赖于'col'(变量)。仍然是它设置的最后一件事(2-> Amy),这解释了为什么你总是得到那个结果。)