问题
Note: I've already tried to find solutions from https://docs.python.org/3/ and other stack overflow questions, but I haven't been able to find it.
What I'm looking for is quite simple. While using a code like this:
import turtle
s = turtle.Screen()
def u():
t.forward(50)
s.onkey(u(), "Up")
s.listen()
It simply runs the code u
So first of all: Why does it not wait until I press "Up"? And second, how can I make it so that it does?
回答1:
You need to do the onkey
and listen
calls outside the u
callback function.
Like this:
import turtle
def u():
t.forward(50)
s = turtle.Screen()
t = turtle.Turtle()
s.onkey(u, "Up")
s.listen()
turtle.done()
Note that in s.onkey(u, "Up")
I just have u
not u()
. The former passes the function itself to .onkey
so it knows what function to call when the "Up"
key event occurs. The latter just passes the result of calling u
(which is None
, since u
doesn't have a return
statement) to .onkey
.
Also, your code omits the turtle.done() call. That tells turtle to go into the event loop so it will listen for events and respond to them. Without it, the script opens a turtle window and then closes it immediately.
BTW, the code you posted has an IndentationError
; correct indentation is vital in Python.
回答2:
You are calling the function when you put parentheses after it. Just take those out to pass the function itself rather than what it returns:
import turtle
s = turtle.Screen()
def u():
t.forward(50)
s.onkey(u, "Up")
s.listen()
In Python, functions are objects just like everything else. You don't need parentheses in order to use them. You could do v = u
and you would be able to use v()
. If you were to say u = 4
, you wouldn't be able to use u()
any more because now u
refers to something else.
来源:https://stackoverflow.com/questions/35978153/how-to-bind-a-button-in-turtle