Я делал змейку для чего-нибудь. Я все еще новичок с 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()
Спасибо, Натан