切换 Python Turtle 模块

Switch in Python Turtle Module

我正在尝试做一个简单的开关,当我按下一个键时它会改变一个变量(在本例中是开关值)。我的方法似乎没有用,据我所知,关键检测是有效的。

import turtle
from turtle import Turtle, Screen

screen = Screen()

jack = Turtle("turtle")
jack.color("red", "green")
jack.pensize(10)
jack.speed(0)
switchvalue = 1


def switch():
    global switchvalue
    if switchvalue == 1:
        switchvalue = 0
    if switchvalue == 0:
        switchvalue = 1




turtle.listen()

turtle.onkey(switch,"s")

screen.mainloop()

if switchvalue == 0:
    jack.forward(100)

您在函数 switch() 处的逻辑错误。看看当 switchvalue1

时开始时会发生什么
def switch():
    global switchvalue
    if switchvalue == 1: # True
        switchvalue = 0 # change it to 0
    if switchvalue == 0: # Whoops, True again, because you switched it to 0 before
        switchvalue = 1

如您所见,您正在将 switchvalue 更改为 0,然后检查它是否为 0,然后将其更改回 1,换句话说,两者if 个语句被执行。您应该改用 elifelse,这样如果一个人成功完成“if 循环”(打个比方)就会中断,也就是其他 if 将不会被检查。

def switch():
    global switchvalue
    # IF one if succeds all the others will not be accounted
    if switchvalue == 1:
        switchvalue = 0
    elif switchvalue == 0:
        switchvalue = 1

即使您解决了@Countour-Integral 指出的 elif 问题,此代码也无法正常工作。 mainloop() 调用之后的代码直到 turtle 关闭后才执行,此时 forward() 没有意义:

screen.mainloop()

if switchvalue == 0:
    jack.forward(100)

您将 turtle 的 functional API 与其 object-oriented API 混合在一起为什么你需要双 import 的海龟:

import turtle
from turtle import Turtle, Screen

这只会带来麻烦。让我们重写程序以仅使用面向对象 API 并实际工作:

from turtle import Turtle, Screen

switchvalue = True

def switch():
    global switchvalue

    switchvalue = not switchvalue

def move():
    delay = 100  # if not moving, slow for human intervention

    if switchvalue:
        jack.forward(1)
        delay = 0  # moving, check back right away

    screen.ontimer(move, delay)  # delay in milliseconds

screen = Screen()

jack = Turtle('turtle')
jack.color('red', 'green')
jack.speed('fastest')
jack.pensize(10)

screen.onkey(switch, 's')
screen.listen()

move()

screen.mainloop()

当程序启动时,乌龟会向右游荡。按's',可以停止和重新开始这个动作。