为什么pycharm执行screen.listen()失败

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

我正在尝试创建一个海龟穿越游戏,但每次运行程序时,

screen.listen()
都没有被执行,
screen.exitonclick()
也没有被执行 单击乌龟窗口运行程序后,它不会关闭,乌龟也不会向前移动

import turtle
from turtle import Screen
from player import Player
import time

screen = Screen()
screen.setup(width=600, height=600)
screen.tracer(0)

player = Player()

screen.listen()
screen.onkey(player.go_up(), "Up")

turtle.TurtleScreen._RUNNING = True
game_is_on = True

while game_is_on:
    time.sleep(0.1)
    screen.update()

screen.exitonclick()

虽然我尝试添加 ._RUNNING 方法,但没有任何区别

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

这里有几个问题:

  1. while game_is_on:
    是一个无限循环,因为
    game_is_on
    永远不会从
    True
    更改为
    False
    。循环之后的任何内容都将永远不会运行。避免使用这种模式;在turtle中进行实时渲染循环的典型方法是
    ontimer
  2. turtle.TurtleScreen._RUNNING = True
    与未记录的内部属性混淆。除非绝对需要,否则不应触及库中的内部属性,因为您可能会破坏实例的状态,并且该属性可能会在更新后消失。我不确定你想在这里做什么,但是要么找到一种使用公共 API 的方法,要么完全删除此代码(如果不是真正需要的话)(我不认为是这样——我从未使用过它)在海龟计划中)。
  3. 虽然
    Player
    的代码没有发布,但
    screen.onkey(player.go_up(), "Up")
    可能是不正确。它立即调用
    go_up()
    方法并将其返回值(可能是
    None
    )设置为
    onkey
    处理程序。您可能指的是
    screen.onkey(player.go_up, "Up")
    ,它不会立即调用该方法,而是将其传递给处理程序,以便稍后在按下按键时由海龟库调用。

有了

Player
的小存根,我建议如下设置:

from turtle import Screen, Turtle


class Player:
    def __init__(self):
        self.turtle = Turtle()

    def go_up(self):
        self.turtle.setheading(90)
        self.turtle.forward(10)


def tick():
    #### the main loop; move/update entities here ####

    screen.update()
    screen.ontimer(tick, 1000 // 30)


screen = Screen()
screen.setup(width=600, height=600)
screen.tracer(0)
player = Player()
screen.onkey(player.go_up, "Up")
screen.listen()
tick()
screen.exitonclick()

现在,您在

tick
中还没有任何代码。这是主要的更新/渲染循环。玩家的动作会很不稳定,因为它直接连接到键盘的重新触发机制。如果这种行为不是您想要的,我建议对按键做出反应并仅在
tick
内更改玩家的位置。有关示例,请参阅如何在海龟图形中将多个按键绑定在一起?

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