这是我的代码:
import turtle as trtl
trtl.hideturtle()
trtl.speed(5)
trtl.tracer(False)
# stop functions
def stopf():
f.clear()
f.append("x")
def stopb():
b.clear()
b.append("x")
def stopd():
d.clear()
d.append("x")
def stopu():
u.clear()
u.append("x")
# empty lists for movement
f = ["x"]
b = ["x"]
u = ["x"]
d = ["x"]
# movement functions
def forward():
for x in f:
trtl.clear()
trtl.circle(10)
trtl.update()
trtl.penup()
trtl.forward(0.05)
trtl.pendown()
f.append("x")
def backward():
for x in b:
trtl.clear()
trtl.circle(10)
trtl.update()
trtl.penup()
trtl.forward(-0.05)
trtl.pendown()
b.append("x")
def downward():
for x in d:
trtl.clear()
trtl.circle(10)
trtl.update()
trtl.penup()
trtl.setheading(90)
trtl.forward(-0.05)
trtl.pendown()
d.append("x")
trtl.setheading(0)
def upward():
for x in u:
trtl.clear()
trtl.circle(10)
trtl.update()
trtl.penup()
trtl.setheading(-90)
trtl.forward(-0.05)
trtl.pendown()
u.append("x")
trtl.setheading(0)
# press and release key tests
trtl.onkeypress(forward, "Right")
trtl.onkeypress(backward, "Left")
trtl.onkeypress(downward, "Down")
trtl.onkeypress(upward, "Up")
trtl.onkey(stopf, "Right")
trtl.onkey(stopb, "Left")
trtl.onkey(stopd, "Down")
trtl.onkey(stopu, "Up")
wn = trtl.Screen()
wn.listen()
wn.mainloop()
(忽略我使用比turtle.shape(“circle”)更复杂的方法来绘制圆。) 不管出于什么原因,当我按住一个方向太久时,它就会永远沿着那个方向前进。有谁知道为什么会这样吗?
它只是响应方向键而正常移动,而不是按住太久后继续移动。
问题在于列表的使用。让我们看看当你按下前进按钮时。
前进
行
trtl.onkeypress(forward, "Right")
调用函数 forward
。对于循环,我们看到 f = ["x"]
已被初始化,因此循环开始:
for x in f:
...
f.append("x")
通过将
"x"
添加到 f
,可以使循环永远持续下去。
停止向前按
现在,
trtl.onkey(stopf, "Right")
致电stopf
。反过来,stopf
会清除并立即将 "x"
添加到 f
。
此方法可能会在短时间内起作用,因为清除列表会停止循环。然而,按住并释放按键会破坏程序的原因是,在
"x"
中添加 stopf
很可能会允许继续向前循环。
这适用于所有方向。您应该使用布尔标志来存储是否按下了某个键,而不是使用列表。