time.wait не работает при использовании с tkinter - PullRequest
0 голосов
/ 29 октября 2019

Я использую time.wait, чтобы показать, как изменится холст при обработке кода, но когда я фактически запускаю код, оболочка python останавливается и показывает холст после того, как все вычисления выполнены и время прошло. Как я могу показать обрабатываемый код? Код ниже об игре жизни.

game_of_life_GUI создает окно для Tkinter, рисует квадраты и собирает его. Increase_map увеличивает размер двухмерного списка на единицу с каждой стороны. next_turn выполняет вычисления и вносит изменения. Переменная map create_random_map создает двумерный список со случайным значением int 0 и 1

master = Tk()

class game_of_life_GUI() :
    def __init__(self, WIDTH, HEIGHT) :
        self.width = WIDTH
        self.height = HEIGHT
        self.start = (self.width - self.height)/2

    def draw(self, w, Map) :
        square_length = self.height / len(Map)
        for i in range(len(Map)) :
            for j in range(len(Map[i])) :
                if(Map[i][j] == 0) :
                    w.create_rectangle(self.start + i*square_length, j*square_length,
                                    self.start + (i+1)*square_length, (j+1)*square_length,
                                    fill = "white", outline = "black")
            else :
                w.create_rectangle(self.start + i*square_length, j*square_length,
                                    self.start + (i+1)*square_length, (j+1)*square_length,
                                    fill = "black", outline = "black")
        w.pack()


def increase_map(Map) :
    for i in range(len(Map)) :
        Map[i].append(0)
        Map[i].append(0)

        Map[i][1:-1] = Map[i][0:-2].copy()
        Map[i][0] = 0

    Map.insert(0, [0]*len(Map[0]))
    Map.append([0]*len(Map[0]))

    return Map

def next_turn(Map) :
    num_y = [-1, 0, 1, -1, 1, -1, 0, 1]
    num_x = [1, 1, 1, 0, 0, -1, -1, -1]
    flag = 0
    new_Map = copy.deepcopy(Map)
    for i in range(len(Map)) :
        for j in range(len(Map[0])) :
            sum = 0
            for p in range(8) :
                try :
                    if(Map[i + num_y[p]][j + num_x[p]] == 1) : sum +=1
                except Exception as e :
                    pass
            if (Map[i][j] == 1 and (sum == 2 or sum == 3)) :
                new_Map[i][j] = 1
                if(flag == 0 and (i ==0 or j == 0)) :
                    flag = 1
            elif (Map[i][j] == 0 and sum == 3) :
                new_Map[i][j] = 1
                if(flag == 0 and (i==0 or j==0)) :
                    flag = 0    
            else :
                new_Map[i][j] = 0

    return (new_Map, flag)

def life_game(Map, num, flag, width, height) :
    GUI = game_of_life_GUI(width, height)
    w = Canvas(master, width = width, height = height)
    for i in range(num) :
        if (flag == 1) :
            Map = increase_map(Map)
        Map, flag = next_turn(Map)
        GUI.draw(w, Map)

    return Map

def create_random_map(length) :
    ls = []

    for i in range(length) :
        ls.append([])
        for j in range(length) :
            ls[i].append(rd.randrange(0, 2))
    return ls

LENGTH = 5
WIDTH, HEIGHT = (500, 500)
ROTATION = 1

Map = create_random_map(LENGTH)
print(Map)

Game = life_game(Map, ROTATION, flag = 1, width = WIDTH, height = HEIGHT)
.
...