单击按钮时更新tkinter画布

时间:2017-07-10 17:41:42

标签: python button lambda tkinter

我想按下面的一个按钮时更新孩子的名字。使用这个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()

1 个答案:

答案 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),这解释了为什么你总是得到那个结果。)