我正在尝试批量创建按钮,但是命令功能不起作用

时间:2019-10-22 16:58:57

标签: python variables tkinter

我想通过使用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

当我运行这段代码并单击一个按钮时,无论我按下哪个按钮,它都会一直指向同一对象

2 个答案:

答案 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()