Чтобы получить доступ к виджетам, созданным в цикле, мы используем словари и список, чтобы сохранить ссылку на них. Позже мы можем изменить их по ссылкам, хранящимся в словарях или списке.
Вот так ..
all_buttons = []
for i in range(9):
button = Button(root, .... )
all_buttons.append(button)
Когда нам нужно получить определенную кнопку, мы можем получить ее по all_buttons[0]
, что даст нам экземпляр из Button
, впервые созданного в цикле.
Но, если вы хотите дать свой собственный тег или имя для ссылки на каждый Button
, используйте словарь , где ключ будет именем, а значением будет экземпляр к Button
.
all_buttons = {}
for i in range(9):
button = Button(root, .... )
all_buttons.update({ 'Button_%s'%i : button })
Для ссылки мы используем all_buttons['Button_0']
дает нам первое созданное Button
.
Теперь, как передавать команды каждой кнопке в цикле.
Я вижу, что вы используете partial
из functools
для передачи аргумента в функцию mark_box
, мы также можем использовать lambda
для получения тех же результатов без импорта functools. Обратитесь к этому сообщению для лучшего понимания.
Вот объединенный пример , как передать аргументы в цикле в функцию обратного вызова Button
, используя lambda
, а также сохранить ссылку на Button
?
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text='Click the Button')
label.pack()
def update(text):
label.config(text="Button %s is clicked"%text)
all_buttons = []
for i in range(9):
button = tk.Button(root, text='Button %s'%i, command=lambda i=i: update(i) )
button.pack()
all_buttons.append(button)
print('\nThis the list containing all the buttons:\n', all_buttons)
root.mainloop()