Как изменить цвет кнопки обратно на оригинальный при повторном нажатии - PullRequest
0 голосов
/ 09 апреля 2019

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

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

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.

1 Ответ

0 голосов
/ 09 апреля 2019

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

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