Я никогда раньше не использовал модуль tkinter
, хотя я хотел учиться.
Так что это попытка отладки вашего кода. ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Этот код работает как ожидалось. Я понятия не имею, если он следует соглашениям для создания приложений с tkinter
. Я использовал пример кода в вопросе в качестве руководства.
Подсказка к проблеме в исключении: changeBG self.config(bg = "red") AttributeError: 'App' object has no attribute 'config'
Мое первое предположение состояло в том, что кнопки должны иметь атрибут, который вы пытаетесь использовать измените, а не экземпляр класса App
, который присваивается self
.
Я создал матрицу (2D-список или «список списков»), в которой можно хранить кнопки.
Примечание что ваш код создает экземпляр Button
, а затем вызывает метод grid
для кнопки, не сохраняя экземпляр кнопки в имени. Возвращение этого grid
метода - None
. self.tab
в вашем исходном коде был списком None
s. В моем коде я вызвал grid
на кнопке после ее создания.
Я использовал этот ответ, чтобы выяснить, как передать аргументы в обратный вызов команды, поскольку никакие аргументы не передаются неявно:
{ ссылка }
Значения row
и col
фиксируются в лямбда-выражении. Когда кнопка нажата, в лямбде вызывается метод экземпляра changeBG
с правильными аргументами, кнопка извлекается из матрицы и обновляется цвет фона.
Я сделал некоторые правки в вашем классе.
from tkinter import *
class App:
root = Tk(className="application 4")
root.geometry("800x600")
root.resizable(height=FALSE, width=FALSE)
def __init__(self, x, y):
# create a matrix for the buttons
self.tab = [[None] * y for _ in range(x)]
for row in range(x):
for col in range(y):
button = Button(
self.root,
width=1,
bg="white",
# use keyword arguments to pass values into instance method
command=lambda row=row, col=col: self.changeBG(row, col),
)
# place the button on a grid after instantiation
# The return of `grid` is None
button.grid(row=row, column=col)
# assign the value in the matrix to the button
self.tab[row][col] = button
self.root.mainloop()
def changeBG(self, row, col):
# the button has the attribute "config"
button = self.tab[row][col] # get button from matrix
button.config(bg="red")
print(f"You clicked button '{button}' at row {row} and col {col}")
application = App(10, 10)