Как изменить цвет кнопки на исходный при повторном нажатии

Я пытаюсь изменить цвет кнопки на черный при нажатии, а затем снова изменить его на белый при повторном нажатии. Я пытаюсь сделать Game Of Life для школьного проекта.

Я пробовал операторы if, но он не меняется обратно на белый, может быть, я пропустил что-то простое. Вот код:

from tkinter import *

class GUI(Frame):
   def __init__(self, master=None):

        Frame.__init__(self, master)
        master.title("Window") #Window title
        self.pack()

        master.geometry("1280x720") #Window size

        self.button = {}#Dictionary for buttons

        self.create_button()

    def create_button(self):
        indexList =[i for i in range(1000)]
        self._button = Button(self, bg='white')
        print(self._button.cget('bg'))

        xPos = 0
        yPos = 0
        for index in indexList:
            if (yPos == 40):
                xPos = xPos + 20
                yPos = 0
            if (xPos == 10):
                yPos = 8

            self._button = Button(self, height=2, width=4, command = lambda 
            i = index: self.changecolour(i))
            self.button[index] = self._button
            self._button.grid(row=xPos, column =yPos)
            yPos = yPos + 1


    def changecolour(self,index):
        aList = []

        for i in range(1000):
            aList.append([i,0])

        for i in aList:
            if index == i[0]:
                if 0 == i[1]: 
                    self.button[index].configure(bg = 'black')
                    i[1] = 1
                else:
                    self.button[index].configure(bg = 'white')
                    i[1] = 0

root = Tk()
game_gui = GUI(master=root)
game_gui.mainloop()

Как вы можете видеть, он меняет цвет кнопки на черный, и он должен снова изменить его на белый при повторном нажатии, но, похоже, он просто игнорирует оператор if.

Вы не нарушаете цикл aList, поэтому оператор if срабатывает несколько раз.

knh190 09.04.2019 18:47

И бессмысленно жестко кодировать i[0] или i[i] внутри цикла. Что вы на самом деле делаете?

knh190 09.04.2019 18:48

Я попытался добавить значение рядом с «индексом» кнопки, поскольку у меня их несколько. Затем, когда цвет меняется, меняется и значение i[1]. Я уверен, что есть лучший способ сделать это, но это то, что пришло мне в голову, когда я это делал.

User50 09.04.2019 19:01
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что это проблема:

aList не является глобальным списком

aList создается в changecolour() как локальный список при каждом запуске подпрограммы

это означает, что когда вы делаете i[1] = 1 или i[1] = 0, изменяется только локальный список- aList. Когда подпрограмма запускается снова, новый aList создается как новый локальный список.

для решения проблемы определите aList в основной программе и сделайте его глобальным списком:

from tkinter import *

class GUI(Frame):
   def __init__(self, master=None):

        Frame.__init__(self, master)
        master.title("Window") #Window title
        self.pack()

        master.geometry("1280x720") #Window size

        self.button = {}#Dictionary for buttons

        self.create_button()

    def create_button(self):
        indexList =[i for i in range(1000)]
        self._button = Button(self, bg='white')
        print(self._button.cget('bg'))

        xPos = 0
        yPos = 0
        for index in indexList:
            if (yPos == 40):
                xPos = xPos + 20
                yPos = 0
            if (xPos == 10):
                yPos = 8

            self._button = Button(self, height=2, width=4, command = lambda 
            i = index: self.changecolour(i))
            self.button[index] = self._button
            self._button.grid(row=xPos, column =yPos)
            yPos = yPos + 1


    def changecolour(self,index):
        #aList IS NO LONGER CREATED HERE

        for i in range(1000):
            aList.append([i,0])

        for i in aList:
            if index == i[0]:
                if 0 == i[1]: 
                    self.button[index].configure(bg = 'black')
                    i[1] = 1
                else:
                    self.button[index].configure(bg = 'white')
                    i[1] = 0

global aList #MAKE IT A GLOBAL LIST
aList = [] #CREATE THE EMPTY aList LIST
root = Tk() 
game_gui = GUI(master=root)
game_gui.mainloop()

Спасибо тебе за это! Это сработало, но вместо того, чтобы использовать глобал, я просто сделал это как self.aList вне метода, поскольку мой учитель постоянно говорит нам избегать глобалов. Теперь все работает, еще раз спасибо за помощь!

User50 09.04.2019 19:00

отличный! Рад был помочь!

user11111136 09.04.2019 19:32

Другие вопросы по теме