Закрытие окон tkinter быстрее (при наличии множества кнопок) - PullRequest
0 голосов
/ 26 ноября 2018

Я пишу свою собственную версию классической «игры жизни Конвея» на 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. Как я мог запрограммировать это лучше, чтобы он был более эффективным в целом, возможно, методом вместо кнопок?

Спасибо.

...