是否可以使用命令列表Tkinter创建按钮列表

时间:2017-07-30 19:20:25

标签: python user-interface tkinter

filebuttons=[]
fileframe=Frame(main,height=1080)
fileframe.pack(side="right",fill="both")

file_label=Label(fileframe, text="File Selected: ",font=('Times New Roman',24))

filecommands=[]
for file in get_files():
    def temp():
        file_label.config(bg="green",text=str("File Selected: "+file))
    filecommands.append(temp)
    filebuttons.append(Button(fileframe,activebackground="green",text=file, width=300))

for n in range(0,len(filebuttons)):
    print(file)
    filebuttons[n].config(command=filecommands[n])

for button in filebuttons:
    button.pack(side="top")

这段代码用于筛选按钮列表并向其添加命令,使用文件列表中的名称设置标签。但是,它只是将最终名称添加到所有按钮的所有命令中,这意味着它们都将标签设置为最后一个文件的文本。

1 个答案:

答案 0 :(得分:2)

问题在于临时性问题。函数使用'文件'的当前值。是,而不是将它添加到列表时的值。这被称为"后期绑定"。要解决这个问题,你需要制作一个closure,它会带来' file'的价值。进入功能。最简单的方法是使用functools.partial函数:

from functools import partial

for file in get_files():
    closure = partial(file_label.config, bg="green", text=str("File Selected: "+file))
    button = Button(fileframe,activebackground="green",text=file, width=300, command=closure)
    button.pack(side="top")