代码如下:
import turtle
width = 400
length = 300
wn = turtle.Screen()
wn.bgcolor("black")
wn.title("x")
drawer = turtle.Turtle()
drawer.speed(3)
drawer.begin_fill()
drawer.color("blue", "yellow")
def drawern():
drawer.seth(90)
drawer.fd(1)
def drawerw():
drawer.seth(180)
drawer.fd(1)
def drawers():
drawer.seth(270)
drawer.fd(1)
def drawere():
drawer.seth(0)
drawer.fd(1)
wn.onkeypress(drawern, "w")
wn.onkeypress(drawerw, "a")
wn.onkeypress(drawers, "s")
wn.onkeypress(drawere, "d")
wn.listen()
wn.mainloop()
给出堆栈溢出错误。有人知道为什么这个问题仍然存在吗?当我偶尔放手的时候,它就不会发生。
我认为堆栈溢出错误是由于重复分配角度到堆栈。为了防止这种情况,可以引入debounce
。我们将debounce
命名为move
。简单来说,debounce是一种故障安全机制,可以防止一个事件一次又一次地触发,同时保持其他代码的运行。
在全局空间定义变量:
move = False
对于功能:
def drawern():
global move #To let the function know the variable is from global scope
if not move: #The key is pressed first time
drawer.seth(90)
move = True #Sets our debounce to True, it will not activate until the key is released
drawer.fd(1)
wn.onkeypress(drawern, "w")
我们需要另一个带有事件的函数来重置我们的debounce:
def reset_db():
global move
move = False #Resets the debounce, referencing the key has been released
wn.onkeyrelease(reset_db, "w") #Connects the event
我在这里只演示了w
键。你也可以为其他键复制它。