更快地关闭tkinter窗口(当有多个按钮时)

2024-10-01 09:19:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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.如何更好地编程,使其总体效率更高,可能是一种方法而不是按钮

谢谢


Tags: inforiftkinterrangewindowelsegrid