我正在尝试创建一个蛇游戏,但我被卡住了。
当我尝试使用
screen.trace(0)
时,我的乌龟图形窗口冻结并且出现错误:
_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()
错误的发生是因为除了粗暴地杀死窗口外,您的主
while
循环没有出路,这可能会触发此错误。 screen.exitonclick()
在您的脚本中无法访问。
ontimer
应该优于 while True: screen.update()
成语,它没有明确的帧速率,基本上运行速度与计算机可以处理的速度一样快。使用 while True:
,您可以在不同的机器上获得截然不同的性能。例如,在我的机器上,蛇会立即飞出屏幕。
如果你使用
ontimer
,你可以更小心地控制绘制帧的速度,循环的回调驱动特性意味着你的代码可以在开始动画之前到达 screen.exitonclick()
调用,而不是在屏幕终止。这避免了难看的TclError
.
举个例子:
from turtle import Screen, Turtle
def update():
for seg in segments:
seg.forward(20)
screen.update()
screen.ontimer(update, target_fps)
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)
target_fps = 1000 // 3 # roughly 3 frames per second
update() # schedule the first frame
screen.exitonclick() # start the turtle main loop and exit on click
注意
update()
每帧只调用一次,而不是每段调用一次。将 update()
视为重绘单帧,将 ontimer
视为安排在绘制下一帧之前应该经过多少时间。
这不是一个完美的实时方法,但它比
while True:
更好。虽然 turtle 不是为实时应用而设计的,但这对于像蛇这样的大多数玩具游戏来说应该足够好了。
相关问题: