所以我想在按下项目按钮时打印项目的文本。
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
,但按钮没有效果。
答案 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