Как изменить фон в кнопке с командой, внутри класса python tkinter OOP? - PullRequest
0 голосов
/ 02 мая 2020

Добро пожаловать Я хочу сделать доску как в шахматах. После того, как я нажму эту кнопку, вы должны изменить свой фон с помощью метода «команда». Я попытался вставить в мой код StringVar (), .config, глобальную переменную и лямбду. Если есть ссылка для решения этой проблемы, я буду рад. (Это мой первый вопрос на этом сайте и извините за все)

from tkinter import *

class App():
    """docstring for App"""
    root=Tk(className="application 4")
    x, y = 0, 0
    tab = []

    def __init__(self, x, y):
        App.x = x
        App.y = y
        App.root.geometry("800x600")
        App.root.resizable(height = FALSE, width = FALSE)
        for i in range(App.x):
            for j in range(App.y):
                App.tab.append(Button(App.root, width=1, bg="white", command=lambda: self.changeBG(self)).grid(row=i, column=j))
        App.root.mainloop()


    def changeBG(self, btn):
        self.config(bg = "red")


application = App(10, 10)

Ошибка:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\S\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "C:\Users\S\Desktop\Spanish number project\clicked.py", line 16, in <lambda>
    App.tab.append(Button(App.root, width=1, bg="white", command=lambda: self.changeBG(self)).grid(row=i, column=j))
  File "C:\Users\S\Desktop\Spanish number project\clicked.py", line 21, in changeBG
    self.config(bg = "red")
AttributeError: 'App' object has no attribute 'config'
[Finished in 6.4s]

1 Ответ

0 голосов
/ 03 мая 2020

Я никогда раньше не использовал модуль 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...