Python 复制的代码有效,而编写的代码无效?

Python 复制的代码有效,而编写的代码无效?,python,python-turtle,Python,Python Turtle,这里是新的Python程序员。我试图在不使用教程的情况下用python编写Snake。我现在正在处理密钥绑定,但遇到了一个问题 #Move snake to the left def move_right(): right = snake.xcor() right += 20 snake.setx(right) #Key bind "d" wn.listen wn.onkeypress(move_right(), "d") 当按下“d”键时,上面的代码应该将蛇向右移

这里是新的Python程序员。我试图在不使用教程的情况下用python编写Snake。我现在正在处理密钥绑定,但遇到了一个问题

#Move snake to the left
def move_right():
    right = snake.xcor()
    right += 20
    snake.setx(right)

#Key bind "d" 
wn.listen
wn.onkeypress(move_right(), "d")
当按下“d”键时,上面的代码应该将蛇向右移动,但它不起作用。然而,当从YouTube上的教程中复制一个功能齐全的Pong程序的代码时,它确实起作用。复制的代码如下所示:

#Function for paddle_b_up
def paddle_b_up():  
    y = paddle_b.ycor() 
    y += 20  
    paddle_b.sety(y)  

#key bind to the up arrow key
wn.onkeypress(paddle_b_up, "Up")

然后,我继续将复制的代码(与Pong程序中的代码完全相同)写入Snake程序,但它不起作用。我很困惑。缩进相同,代码相同(保存一些不同但一致的变量),只有Pong程序中的移动和键绑定代码被复制到Snake程序中。在不改变任何其他内容的情况下,Pong代码可以工作,但只有当我将代码复制并粘贴到Snake程序中时,Pong代码才能工作。有什么建议吗?谢谢。

请注意对
wn.onkeypress()
的两个调用之间的差异。在复制的代码中,在
向上划桨
之后没有
()
,但在代码中,您有
向右移动()

当你把
()
放在函数名后面时,它会立即调用它。但您希望稍后在按下该键时调用该函数。您需要传递对函数的引用,而不是调用函数的结果

wn.onkeypress(move_right, "d")

wn之后还需要
()
。listen
因此调用该函数。

您忘记了
listen()
中的
()
。然后从
中的
向右移动
中删除
()
。按onkeypress(向右移动,“d”)
onkeypress
只需要函数名,不需要
()
-它被称为
回调
。正如您所看到的,工作代码在
wn.onkeypress(paile\u b\u up,“up”)
中有
paile\u b\u up
而没有
()
不确定我怎么会错过pailer\u b\u up中缺少括号的部分,但是,它现在正在工作。如果你不介意的话,你能解释一下为什么不需要括号吗?我在另一个python教程中了解到回调中需要括号。我确实在wn.listen中有()但是在重新编写代码时忘了在这里添加它们。谢谢圆括号一次执行函数,但您希望稍后再执行它—当您按键时—所以您只发送函数的名称,当您按键时,它将使用
()
来运行它。它在许多语言中都很流行,函数名作为参数被称为
“callback”
我现在明白了。非常感谢。嗨,巴尔马!谢谢你的解释。我不确定我是如何错过了palle_b_up中缺少括号的地方,但是当我将它们从move_right中删除时,代码就工作了。你能解释一下为什么不需要括号吗?我在其他Python程序中学习过括号是必需的。当然,教程中没有使用海龟,但我还是很好奇。也许我只是记错了?我确实在原始代码中编写了wn.listen(),但忘了在这里编写,哈哈。再次感谢!我在回答中解释了这一点。当您想调用函数时,可以使用括号。当您告诉函数在用户按键时该做什么时,您不想调用该函数。你想在按键时调用这个函数,我现在明白了。非常感谢。
wn.onkeypress(move_right, "d")