我正在使用tkinter模块用python编写我自己的经典《康威的人生游戏》版本。具体细节对这个问题来说并不重要,但我使用了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按钮窗口,然后关闭shell。我知道代码效率很低,写得很糟糕,但我基本上有两个问题: 1.是否有任何方法可以更快地关闭此程序(即,强制关闭只会终止程序) 2.如何更好地编程,使其总体效率更高,可能是一种方法而不是按钮
谢谢
目前没有回答
相关问题 更多 >
编程相关推荐