我想通过使用for循环和exec函数来批量创建tkinter按钮,但是当我设置命令时,它将继续为数据库中的最后一块调用该函数
for i in FirstFloor:
exec('room_%d = CreateRoom(FirstFloor[i]["name"])'%index)
exec('lbl_%d = Button(window, text=FirstFloor[i]["name"], command=lambda: move(FirstFloor[i]["x"], FirstFloor[i]["y"]), bg="light grey")'%index)
exec('lbl_%d.grid(column=FirstFloor[i]["x"], row=FirstFloor[i]["y"], columnspan=FirstFloor[i]["xspan"], rowspan=FirstFloor[i]["yspan"])'%index)
if FirstFloor[i]["locked"] == True:
exec('lbl_%d.config(state="disabled", bg="red")'%index)
index += 1
当我运行这段代码并单击一个按钮时,无论我按下哪个按钮,它都会一直指向同一对象
答案 0 :(得分:1)
更改此:
command=lambda: move(FirstFloor[i]["x"]
对此:
command=lambda i=i: move(FirstFloor[i]["x"]
答案 1 :(得分:1)
您可以批量创建按钮,而无需使用exec
。您可以使用列表,字典或元组。我通常使用列表。
通过使用列表,我们可以引用索引来与按钮交互。
示例:
import tkinter as tk
root = tk.Tk()
button_list = []
def do_something(some_value):
print(button_list[some_value]['text'])
for i in range(10):
button_list.append(tk.Button(root, text='Button {}'.format(i+1), command=lambda i=i: do_something(i)))
button_list[-1].grid(row=i, column=0)
root.mainloop()