Я пытаюсь изменить цвет кнопки на черный при нажатии, а затем снова изменить его на белый при повторном нажатии. Я пытаюсь сделать 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.
И бессмысленно жестко кодировать i[0]
или i[i]
внутри цикла. Что вы на самом деле делаете?
Я попытался добавить значение рядом с «индексом» кнопки, поскольку у меня их несколько. Затем, когда цвет меняется, меняется и значение i[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 вне метода, поскольку мой учитель постоянно говорит нам избегать глобалов. Теперь все работает, еще раз спасибо за помощь!
отличный! Рад был помочь!
Вы не нарушаете цикл
aList
, поэтому оператор if срабатывает несколько раз.