在 turtle 中使用 screen.trace(0) 时出错:_tkinter.TclError: invalid command name ".!canvas"

问题描述 投票:0回答:1

我正在尝试创建一个蛇游戏,但我被卡住了。

当我尝试使用

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()
python pycharm turtle-graphics python-turtle
1个回答
0
投票

错误的发生是因为除了粗暴地杀死窗口外,您的主

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 不是为实时应用而设计的,但这对于像蛇这样的大多数玩具游戏来说应该足够好了。


相关问题:

© www.soinside.com 2019 - 2024. All rights reserved.