Программа Python snake внезапно стала очень медленной с after () - PullRequest
0 голосов
/ 07 августа 2020

Я делал змейку для чего-нибудь. Я все еще новичок с Python. Я использовал tkinter, чтобы нарисовать поле, которое перемещается с помощью клавиш, которые вы нажимаете. Стадия, на которую я добрался, - это движение в основном вниз. Куб движется в правильном направлении и всегда остается внутри одного из кубиков фона. Однако при открытии моего кода сегодня, без каких-либо изменений со вчерашнего дня, он внезапно стал довольно медленным и запаздывающим. Чтобы проверить, я также пробовал предыдущие версии своего кода, и они тоже испытывали такое же отставание. Я возился и пробовал разные вещи, чтобы исправить это. Я оптимизировал перерисовку куба, чтобы использовать coords () вместо удаления и перерисовки. Я пробовал поиграть с методом after (). Я не совсем уверен, что происходит. Вот код, если кто-то хочет взглянуть:

from tkinter import *

root = Tk()
board = Canvas(root, width = 497, height = 497, background = "white")

class Snake:
    def __init__(self, parent):
        self.move = 0
        self.pos = 0
        self.previous_pos = 0
        self.x1 = 100
        self.x2 = 125
        self.y1 = 100
        self.y2 = 125
        root.bind_all('<Key>', self.key_checker)
        root.after(5, self.on_timer)

    def create_board(self):
        for i in range(0, 21):
            if i % 2 == 0:
                for n in range(0, 21, 2):
                    tmp_x1 = n * 25
                    tmp_x2 = tmp_x1 + 25
                    tmp_y1 = i * 25
                    tmp_y2 = tmp_y1 + 25
                    background_square1 = board.create_rectangle(tmp_x1, tmp_y1, tmp_x2, tmp_y2, fill = "light grey")
            else:
                for n in range(1, 21, 2):
                    tmp_x1 = n * 25
                    tmp_x2 = tmp_x1 + 25
                    tmp_y1 = i * 25
                    tmp_y2 = tmp_y1 + 25
                    background_square1 = board.create_rectangle(tmp_x1, tmp_y1, tmp_x2, tmp_y2, fill = "light grey")

        self.snake = board.create_rectangle(self.x1, self.y1, self.x2, self.y2, fill = "black")

    def draw_snake(self):
    
        if self.x1 == 500:
            self.x1 = 0
            self.x2 = 25
        elif self.x1 == 0:
            self.x1 = 475
            self.x2 = 500
        elif self.y1 == 500:
            self.y1 = 0
            self.y2 = 25
        elif self.y1 == 0:
            self.y1 = 475
            self.y2 = 500
            
        board.coords(self.snake, self.x1, self.y1, self.x2, self.y2)
        board.pack()

    def move_snake(self):
        if self.pos == 1:
            if self.y1 % 25 == 0:
                self.x1 += 1
                self.x2 += 1
            elif self.previous_pos == 2:
                self.x1 -= 1
                self.x2 -= 1
            elif self.previous_pos == 3:
                self.y1 += 1
                self.y2 += 1
            elif self.previous_pos == 4:
                self.y1 -= 1
                self.y2 -= 1
                
        elif self.pos == 2:
            if self.y1 % 25 == 0:
                self.x1 -= 1
                self.x2 -= 1
            elif self.previous_pos == 1:
                self.x1 += 1
                self.x2 += 1
            elif self.previous_pos == 3:
                self.y1 += 1
                self.y2 += 1
            elif self.previous_pos == 4:
                self.y1 -= 1
                self.y2 -= 1

        elif self.pos == 3:
            if self.x1 % 25 == 0:
                self.y1 += 1
                self.y2 += 1
            elif self.previous_pos == 1:
                self.x1 += 1
                self.x2 += 1
            elif self.previous_pos == 2:
                self.x1 -= 1
                self.x2 -= 1
            elif self.previous_pos == 4:
                self.y1 -= 1
                self.y2 -= 1

        elif self.pos == 4:
            if self.x1 % 25 == 0:
                self.y1 -= 1
                self.y2 -= 1
            elif self.previous_pos == 1:
                self.x1 += 1
                self.x2 += 1
            elif self.previous_pos == 2:
                self.x1 -= 1
                self.x2 -= 1
            elif self.previous_pos == 3:
                self.y1 += 1
                self.y2 += 1

    def key_checker(self, event):
        self.previous_pos = self.pos
        if event.keysym == 'Right':
            self.pos = 1
        elif event.keysym == 'Left':
            self.pos = 2
        elif event.keysym == 'Down':
            self.pos = 3
        elif event.keysym == 'Up':
            self.pos = 4

    def on_timer(self):
        self.move_snake()
        self.draw_snake()
        root.after(5, self.on_timer)
        
player = Snake(root)
player.create_board()
root.after(1000, player.move_snake)
root.mainloop()

Спасибо, Натан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...