pycharm 使用屏幕时出错,trace(0)in turtle:_tkinter.TclError:无效命令名“”,!canvas”

n1bvdmb6  于 2023-04-30  发布在  PyCharm
关注(0)|答案(1)|浏览(331)

我正在尝试创建一个蛇游戏,但我卡住了。
当我尝试使用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()
r3i60tvu

r3i60tvu1#

发生错误是因为除了不优雅地终止窗口之外,没有其他方法可以退出主while循环,这可能会触发此错误。screen.exitonclick()在脚本中不可访问。
ontimer应该优于while True: screen.update(),后者没有明确的帧率,基本上是计算机可以处理的最快速度。使用while True:,您可以在不同的机器上获得截然不同的性能。例如,在我的机器上,蛇立即飞离屏幕。
如果使用ontimer,则可以更仔细地控制绘制帧的速度,并且循环的回调驱动性质意味着代码可以在开始动画之前到达screen.exitonclick()调用。这可以让你实际上退出点击和清理很好。
下面是一个例子:

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不是为实时应用程序设计的,但对于大多数玩具游戏(如snake)来说,这应该足够了。
相关问题:

相关问题