如何在for循环中正确制作Tkinter按钮?

时间:2017-03-11 16:36:45

标签: python dictionary tkinter

所以我想在按下项目按钮时打印项目的文本。

from tkinter import *
from tkinter import ttk

root = Tk()
root.title('test')

mainframe = ttk.Frame(root, padding='8')
mainframe.grid(column=0, row=0)

items = [
    {
        'name' : '0001',
        'text' : '1111',
    },{
        'name' : '0002',
        'text' : '2222',
    },{
        'name' : '0003',
        'text' : '3333',
    },
]

rcount = 1 #row count
for item in items:
    ttk.Label(mainframe, text=item['name']).grid(column=1, row=rcount, sticky=W)
    ttk.Button(mainframe, text='->', command=lambda:print(item['text'])).grid(column=2, row=rcount, sticky=W)
    rcount += 1

root.mainloop()

我按下的三个按钮中的任何一个3333。如果我删除lambda,我会在程序开始时得到1111 2222 3333,但按钮没有效果。

1 个答案:

答案 0 :(得分:2)

您可以做的一个简单的改变是使用functools.partial而不是lambda。由于lambda在按下按钮后评估语句,因此最后一项将是3333. partial部分保存args并且与lambda相同(在按下按钮后评估语句)

#rest the same
from functools import partial
for rcount, item in enumerate(items, start=1): #use this as row count
    ttk.Label(mainframe, text=item['name']).grid(column=1, row=rcount, sticky=W)
    ttk.Button(mainframe, text='->', command=partial(print,item['text'])).grid(column=2, row=rcount, sticky=W)

有关如何使用partial的更多信息,请参阅https://docs.python.org/3/library/functools.html#functools.partial