【问题标题】:Update tkinter canvas when button is clicked单击按钮时更新 tkinter 画布
【发布时间】:2017-07-10 17:41:41
【问题描述】:

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

【问题讨论】:

    标签: python button lambda tkinter


    【解决方案1】:

    如果将 get_name 更改为柯里化函数:

    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) 的最后一件事,这解释了为什么你总是得到这个结果。)

    【讨论】:

    • 卡德纳里姆,谢谢。我以前从未使用过咖喱函数。正如你告诉我的,它工作得很好。我只需要在您的 get_name 定义中添加 self 即可。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    相关资源
    最近更新 更多