Я пишу свою собственную версию классической «игры жизни Конвея» на python с использованием модуля tkinter.Специфика не очень важна для этого вопроса, но я использовал 7000 кнопок для создания сетки ячеек.Это означает, что для открытия программы требуется много времени, и особенно трудно ее закрыть.Вот код:
import time
import tkinter
NewGrid = []
ButtonList = []
Go = False
Counter = 0
def Repeat():
Time = float(input("Time between each generation? "))*1000
for i in range(0, int(input("How many generations? "))):
Window.after(int(Time), Start())
def Start():
Grid = []
for i in range(0, 7000):
Grid.append("0")
for i in range(0, len(ButtonList)):
Coordinate = ButtonList[i].cget('bg')
if Coordinate == "white":
Grid.insert(i-1, "1")
Grid.pop(i)
Grid = Turn(Grid, NewGrid)
def onClick(idx):
Colour = ButtonList[idx].cget("bg")
if Colour == "black":
ButtonList[idx].configure(bg = "white")
else:
ButtonList[idx].configure(bg = "black")
def CheckCells(Check, LocalGrid, i, NewGrid):
Surrounding = 0
if LocalGrid[i] == "1":
for x in Check:
if LocalGrid[i+x] == "1":
Surrounding += 1
if Surrounding < 2 or Surrounding > 3:
NewGrid[i] = "0"
ButtonList[i+1].configure(bg = "black")
Window.update()
else:
NewGrid[i] = "1"
elif LocalGrid[i] == "0":
for x in Check:
if LocalGrid[i+x] == "1":
Surrounding += 1
if Surrounding == 3:
NewGrid[i] = "1"
ButtonList[i+1].configure(bg = "white")
Window.update()
else:
NewGrid[i+1] = "0"
return NewGrid
def Turn(LocalGrid, NewGrid):
NewGrid = []
for i in range(0, 7000):
NewGrid.append("0")
FullCheck = [-176, -175, -174, -1, 1, 174, 175, 176]
TopCheck = [-1, 1, 174, 175, 176]
ButtonottomCheck = [-176, -175, -174, -1, 1]
RightCheck = [-176, -175, -1, 174, 175]
LeftCheck = [-175, -174, 1, 175, 176]
TopLeftCheck = [1, 175, 176]
TopRightCheck = [-1, 174, 175]
ButtonottomLeftCheck = [-175, -174, 1]
ButtonottomRightCheck = [-176, -175, -1]
for i in range(0, len(LocalGrid)-176):
if i == 0:
NewGrid = CheckCells(TopLeftCheck, LocalGrid, i, NewGrid)
elif i == 174:
NewGrid = CheckCells(TopRightCheck, LocalGrid, i, NewGrid)
elif i == 6849:
NewGrid = CheckCells(ButtonottomLeftCheck, LocalGrid, i, NewGrid)
elif i == 6999:
NewGrid = CheckCells(ButtonottomRightCheck, LocalGrid, i, NewGrid)
elif (i + 1) % 175 == 0:
try:
int(((i + 1) / 175)/2)
NewGrid = CheckCells(RightCheck, LocalGrid, i, NewGrid)
except:
NewGrid = CheckCells(LeftCheck, LocalGrid, i, NewGrid)
else:
if 0 < i < 174:
NewGrid = CheckCells(TopCheck, LocalGrid, i, NewGrid)
elif 6849 < i < 6999:
NewGrid = CheckCells(ButtonottomCheck, LocalGrid, i, NewGrid)
else:
NewGrid = CheckCells(FullCheck, LocalGrid, i, NewGrid)
Window = tkinter.Tk()
Window.attributes("-fullscreen", True)
StartWindow = tkinter.Tk()
StartButton = tkinter.Button(StartWindow,
text = "Go",
command = Repeat).pack()
r = 0
c = 0
for i in range(0, 7000):
Button = tkinter.Button(Window,
bg = "black",
height = 1,
width = 1,
command = lambda idx = i: onClick(idx))
ButtonList.append(Button)
Button.grid(row = r, column = c)
if c == 174:
c = 0
r += 1
else:
c += 1
Window.mainloop()
В нынешнем виде я нахожу, что самый быстрый способ закрыть программу - это нажать Alt + F4 в окне кнопок, а затем закрыть оболочку.Я знаю, что код очень неэффективен и плохо написан, но у меня есть два вопроса: 1. Есть ли способ закрыть это быстрее, т.е.принудительное закрытие, которое просто убивает программу 2. Как я мог запрограммировать это лучше, чтобы он был более эффективным в целом, возможно, методом вместо кнопок?
Спасибо.