Вы можете создавать кнопки в циклах и сохранять ссылку на кнопку в словаре или списке.
Необъектно-ориентированный подход
В следующем примере используется традиционный подход к выполнениювсе работы в основном классе.Он использует lambda
для передачи индекса кнопки в функцию обратного вызова.
from tkinter import *
mycolor = '#FF7F50'
mycolor2 = '#FFFFFF'
mycolor3 = '#BAF0FF'
class Window:
def __init__(self, master):
self.master = master
self.master.title("Bingo")
self.master.minsize(width=1920, height=1080)
self.master.config(bg=mycolor3)
self.buttons = {}
font = ('Helvetica', 12)
for i in range(1,10):
button = Button(master, text=str(i), font=font,
height=1, width=20, bg=mycolor2,
command=lambda index=i: self.toggle(index))
button.grid(column=0, row=i+1)
self.buttons[i] = button
def toggle(self, index):
button = self.buttons[index]
if button.cget('bg') == mycolor2:
button.configure(bg=mycolor)
else:
button.configure(bg=mycolor2)
root = Tk()
my_win = Window(root)
root.mainloop()
Примечание: вы также можете настроить activebackground
так, чтобы вы могли видеть новый цвет без необходимости убирать мышькнопки.
button.configure(bg=mycolor, activebackground=mycolor)
Объектно-ориентированный подход
Другое решение заключается в создании пользовательского виджета кнопки, который имеет встроенную функцию переключения, чтобы вызывающему не нужно было ничего делать, кроме создания экземпляров.пользовательской кнопки.Это немного упрощает обратный вызов, поскольку каждая кнопка знает себя, и ей не нужно указывать, какую кнопку переключать.
В этом примере все еще сохраняются кнопки в словаре, хотя, строго говоря, в этом конкретном примере это не нужно.:
from tkinter import *
mycolor = '#FF7F50'
mycolor2 = '#FFFFFF'
mycolor3 = '#BAF0FF'
class Window:
def __init__(self, master):
self.master = master
self.master.title("Bingo")
self.master.minsize(width=1920, height=1080)
self.master.config(bg=mycolor3)
self.buttons = {}
font = ('Helvetica', 23)
for i in range(1,75):
button = Toggler(master, text=str(i), font=font, color1=mycolor, color2=mycolor2)
button.grid(column=0, row=i+1)
self.buttons[i] = button
class Toggler(Button):
def __init__(self, master, text, font, color1, color2):
self.color1 = color1
self.color2 = color2
Button.__init__(self, master, text=text, font=font,
height=1, width=20,
background=color1, activebackground=color1,
command=self.toggle)
def toggle(self):
color = self.cget("background")
new_color = self.color1 if color == self.color2 else self.color2
self.configure(background=new_color, activebackground=new_color)
root = Tk()
my_win = Window(root)
root.mainloop()