再次单击时如何将按钮颜色更改回原始颜色

时间:2019-04-09 16:42:08

标签: python tkinter

我试图在单击时将按钮颜色更改为黑色,然后在再次单击时将其颜色更改为白色。我正在尝试为学校项目制作《人生的游戏》。

我尝试了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语句。

1 个答案:

答案 0 :(得分:0)

我认为这是问题所在

aList不是全局列表

每次运行子例程时,都会在aList中将

changecolour()作为本地列表创建

这意味着当您执行i[1] = 1i[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()