使用 screen.tracer(0) 后 Python 屏幕崩溃

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

这是我的代码:

from turtle import Screen, Turtle

screen = Screen()
screen.setup(600, 600)
screen.bgcolor("black")
screen.title("My Snake Game")
screen.tracer(0)

starting_position =[(0, 0), (-20, 0), (-40,  0)]
segments = []
game_is_on = True
for position in starting_position:
    new_segment = Turtle("square")
    new_segment.color("white")
    new_segment.penup()
    new_segment.goto(position)
    segments.append(new_segment)
screen.update()
while game_is_on:
    for seg in segments:
        seg.forward(20)

screen.exitonclick()

我编写了另一个代码来绘制一幅肖像画,但也崩溃了。

我正在尝试构建一个贪吃蛇游戏。我使用

screen.tracer(0)
后,屏幕冻结,我什么也做不了。仅当我强行关闭屏幕时,屏幕才会关闭。

That`s the screen:

python pycharm screen turtle-graphics python-turtle
1个回答
0
投票

while True:
是一个无限循环。 CPU 试图尽可能快地运行它(原始代码在 Ubuntu 上的
top
输出)受到猛烈撞击:

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  
1361630 greg      20   0   43976  22868  11136 R 100.3   0.1   0:08.17 python3 

CPU 已达到 100% 最大化。

不要使用

while True:
,而是使用
ontimer
,它以相当一致的速度运行,并在帧之间为进程和 CPU 提供执行其他操作的时间:

from turtle import Screen, Turtle


screen = Screen()
screen.setup(600, 600)
screen.bgcolor("black")
screen.title("My Snake Game")
screen.tracer(0)

starting_position = [(0, 0), (-20, 0), (-40,  0)]
segments = []
game_is_on = True

for position in starting_position:
    new_segment = Turtle("square")
    new_segment.color("white")
    new_segment.penup()
    new_segment.goto(position)
    segments.append(new_segment)


def tick():
    if not game_is_on:
        return

    for seg in segments:
        seg.forward(20)

    screen.update()
    screen.ontimer(tick, 1000 // 5)  # ~5 FPS


tick()
screen.exitonclick()  # side benefit: now this is reachable

现在

top
很开心:

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  
1362623 greg      20   0   41924  21300  11520 S   0.3   0.1   0:00.20 python3

另请参阅海龟动画在 python 中速度非常快。答案是相同的,但问题有点不同,因为在那个问题中,代码在

.update()
循环中调用
while True:
,而在这个问题中,
.update()
没有在循环中调用

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