如何让listen()在输入之间等待?

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

所以我有一个我的乌龟的运动脚本(称为 mc)

from turtle import *

wn = Screen()
MC=Turtle()

def w():
    mc.shape(FFM1)
    mc.forward(40)
    mc.shape(FFM2)
    mc.forward(40)
    mc.shape(FFS)

def s():
    mc.shape(BFM1)
    mc.bk(40)
    mc.shape(BFM2)
    mc.bk(40)
    mc.shape(BFS)

def a():
    mc.shape(LFM1)
    mc.setx(mc.xcor() - 40)
    mc.shape(LFM2)
    mc.setx(mc.xcor() - 40)
    mc.shape(LFS)

def d():
    mc.shape(RFM1)
    mc.setx(mc.xcor() + 40)
    mc.shape(RFM2)
    mc.setx(mc.xcor() + 40)
    mc.shape(RFS)

wn.onkey(w, "w")
wn.onkey(s, "s") # "Back"
#         ^^^^
wn.onkey(a, "a")
wn.onkey(d, "d")

listen()
mainloop()

这是可行的,但是如果我在乌龟仍在移动时多次按 d,它会继续移动,但是当它停止时,它会传送回它应该从第一次移动开始的位置。

我尝试在函数中添加 time.sleep(2) 但它没有做任何事情,只是将乌龟冻结两秒钟,然后继续破坏

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

列表 [Python.Docs]:海龟 - 海龟图形。请阅读您正在使用的功能和其他功能的文档。

问题:

  • listen不等待用户输入

  • 你的整个运动方案都错了。海龟(在本例中)向某个方向移动一步。你永远不会改变方向(默认是(右、西)),所以无论你按4个键中的哪一个,它都只会沿着X轴移动

因此,问题中的代码无法工作(更不用说像FFS这样的未定义变量)。我修改了脚本以使其正常工作(还添加了一些改进)。

code00.py

#!/usr/bin/env python

import sys
import turtle


# @TODO - c. Remove themfati: added these to get rid of errors. Remove them
FFM1 = None
FFM2 = None
FFS = None
BFM1 = None
BFM2 = None
BFS = None
LFM1 = None
LFM2 = None
LFS = None
RFM1 = None
RFM2 = None
RFS = None

screen = turtle.Screen()
obj = turtle.Turtle()
step = 20


def up():
    obj.seth(90)
    obj.shape(FFM1)
    obj.forward(step)
    obj.shape(FFM2)
    obj.forward(step)
    obj.shape(FFS)


def down():
    obj.seth(270)
    obj.shape(BFM1)
    obj.forward(step)
    obj.shape(BFM2)
    obj.forward(step)
    obj.shape(BFS)


def left():
    obj.seth(180)
    obj.shape(LFM1)
    obj.forward(step)
    obj.shape(LFM2)
    obj.forward(step)
    obj.shape(LFS)


def right():
    obj.seth(0)
    obj.shape(RFM1)
    obj.forward(step)
    obj.shape(RFM2)
    obj.forward(step)
    obj.shape(RFS)


def main(*argv):
    obj.speed(0)
    screen.onkey(up, "w")
    screen.onkey(down, "s")
    screen.onkey(left, "a")
    screen.onkey(right, "d")
    # @TODO - cfati: These bindings might be removed as well
    screen.onkey(turtle.bye, "q")
    screen.onkey(obj.clear, "c")

    turtle.listen()
    turtle.mainloop()


if __name__ == "__main__":
    print(
        "Python {:s} {:03d}bit on {:s}\n".format(
            " ".join(elem.strip() for elem in sys.version.split("\n")),
            64 if sys.maxsize > 0x100000000 else 32,
            sys.platform,
        )
    )
    rc = main(*sys.argv[1:])
    print("\nDone.\n")
    sys.exit(rc)

这是一个打印屏幕示例:

img00

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