Я пытаюсь создать кнопки навалом, но команда не хочет работать - PullRequest
0 голосов
/ 22 октября 2019

Я хочу создать кнопки tkinter навалом, используя цикл for и функцию exec, но когда я задаю команду, он продолжает вызывать функцию для последней части в моей базе данных

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 ]

1 голос
/ 22 октября 2019

Вы можете создавать кнопки без 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()
1 голос
/ 22 октября 2019

Измените это:

command=lambda: move(FirstFloor[i]["x"]

на это:

command=lambda i=i: move(FirstFloor[i]["x"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...