Причина вашей проблемы:
Проблема в том, что при выполнении этой строки: btn = Button(command =lambda:[RandomColor()])
к концу цикла вы получаете ссылку только на последнюю кнопкукоторый создан.Вы теряете ссылку на другие кнопки.
Решение:
Вы можете решить эту проблему, если положитесь на winfo_children()
.
Вы должны сделать 2 шага, чтобы решить вашу проблему:
Прежде всего, измените: btn = Button(command =lambda:[RandomColor()])
на btn = Button(window, command=lambda:[RandomColor()])
.Это просто означает, что мы прикрепляем каждую созданную кнопку к родительскому виджету с именем window
.
. Тогда все, что вам нужно изменить, это RandomColor()
тело функции следующим образом:
def RandomColor():
for child in window.winfo_children():
child.configure(bg=color[randint(0,6)])
Демо:
![enter image description here](https://i.stack.imgur.com/l4MCx.png)
Это решает вашу проблему, но ваш код не является чистым.Вы можете запросить предложения по улучшению кода на веб-сайте Code Review .
РЕДАКТИРОВАТЬ:
Вот решение для сценария, который вы описали в комментарии.
Обратите внимание, что мне пришлось создавать код с чистого листа (я знаю, что вы начали только сегодня, поэтому я не виню вас).В этом коде я сохраняю ссылку для каждой создаваемой кнопки:
import tkinter as tk
import random
class ChangeBottomRightColor(tk.Frame):
def __init__(self, master):
self.master = master
tk.Frame.__init__(self, self.master)
self.__colors = ["red","blue","green","yellow","black","purple","orange"]
self.configure_gui()
self.create_widgets()
def configure_gui(self):
pass
def create_widgets(self):
self.create_buttons()
def create_buttons(self):
self.buttons = {}
c = 0
for i in range(4):
for j in range(4):
self.buttons['button{}'.format(c)] = tk.Button(self.master)
self.buttons['button{}'.format(c)].grid(row=i, column=j)
self.buttons['button{}'.format(c)].config(width=3, height=3)
self.buttons['button{}'.format(c)].config(command=self.change_bottom_right_button_color)
c += 1
def get_random_color(self):
return random.choice(self.__colors)
def change_bottom_right_button_color(self):
self.buttons['button{}'.format(15)].config(bg=self.get_random_color())
if __name__ == '__main__':
root = tk.Tk()
main_app = ChangeBottomRightColor(root)
root.mainloop()
Демо:
![enter image description here](https://i.stack.imgur.com/1JdNZ.png)