我正在尝试创建一个蛇游戏,但我卡住了。
当我尝试使用screen.trace(0)
时,我的turtle图形窗口冻结了,我得到了错误:
_tkinter.TclError: invalid command name ".!canvas"
是什么导致了这个问题,我如何修复这个错误?
from turtle import Screen, Turtle
screen = Screen()
screen.setup(width=600, height=600)
screen.bgcolor("black")
screen.title("Snake Game")
screen.tracer(0)
x_positions = [-20,0,20]
segments = []
for snake_index in range(0, 3):
new_snake = Turtle(shape="square")
new_snake.color("green")
new_snake.penup()
new_snake.goto(y=0, x=x_positions[snake_index])
segments.append(new_snake)
game_is_on = True
while game_is_on:
for seg in segments:
seg.forward(20)
screen.update()
screen.exitonclick()
1条答案
按热度按时间r3i60tvu1#
发生错误是因为除了不优雅地终止窗口之外,没有其他方法可以退出主
while
循环,这可能会触发此错误。screen.exitonclick()
在脚本中不可访问。ontimer
应该优于while True: screen.update()
,后者没有明确的帧率,基本上是计算机可以处理的最快速度。使用while True:
,您可以在不同的机器上获得截然不同的性能。例如,在我的机器上,蛇立即飞离屏幕。如果使用
ontimer
,则可以更仔细地控制绘制帧的速度,并且循环的回调驱动性质意味着代码可以在开始动画之前到达screen.exitonclick()
调用。这可以让你实际上退出点击和清理很好。下面是一个例子:
请注意,
update()
每帧只调用一次,而不是每段调用一次。可以将update()
视为重绘单个帧,将ontimer
视为调度在绘制下一帧之前应该经过多少时间。这不是一个完美的实时方法,但它比
while True:
好。尽管turtle不是为实时应用程序设计的,但对于大多数玩具游戏(如snake)来说,这应该足够了。相关问题: