在海龟库中长时间按住w键移动海龟后,我的程序崩溃了



代码如下:

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键。你也可以为其他键复制它。

最新更新