#python #turtle-graphics
#python #черепаха-графика
Вопрос:
У меня есть скрипт для простой черепашьей гонки, и я хочу, чтобы гонка начиналась, когда пользователь нажимает левую кнопку мыши, поэтому у меня есть этот код
def tur_race():
for step in range(0, 135):
tur1.forward(randint(1, 5))
tur2.forward(randint(1, 5))
turtle.pu()
turtle.goto(-250, -150)
turtle.write("click the mouse to start")
turtle.ht()
turtle.onscreenclick(tur_race())
turtle.mainloop()
Предположим, что у меня определены все переменные.
когда я запускаю этот код, гонка запускается автоматически и не ждет щелчка.
Комментарии:
1.
turtle.onscreenclick( tur_race )
без()
послеtur_race
2. @furas вы могли бы добавить это в качестве ответа. Не могли бы вы?
Ответ №1:
onscreenclick
принимает функцию в качестве своего параметра. Вы не должны вызывать tur_race
, turtle сделает это при щелчке, скорее вы должны передать tur_race
себя. Это называется обратным вызовом, вы предоставляете функцию или метод, который будет вызван некоторым прослушивателем событий (например, щелчком мыши на экране).
Ответ №2:
В дополнение к отличному ответу @nglazerdev, это будет ваш код после того, как вы примените то, что он сказал.
from turtle import *
def tur_race():
for step in range(0, 135):
tur1.forward(randint(1, 5))
tur2.forward(randint(1, 5))
turtle.pu()
turtle.goto(-250, -150)
turtle.write("click the mouse to start")
turtle.ht()
turtle.onscreenclick(tur_race)
turtle.mainloop()
Вы удаляете ()
в tur_race
функции. В противном случае он будет вызван немедленно.
Надеюсь, это поможет!!
Ответ №3:
Вам нужно turtle.onscreenclick( tur_race )
без ()
после tur_race
Python может присвоить переменной имя функции (без ()
и аргументов) и использовать его позже — как в примере
show = print
show("Hello World")
Он также может использовать имя функции в качестве параметра в другой функции, и эта функция будет использовать его позже.
Вместо этого (на разных языках программирования) вызывается имя этой функции "callback"
В turtle.onscreenclick( tur_race )
вы отправляете имя функции onscreenclick
и turtle
будете использовать эту функцию позже — при нажатии на экран.
Если вы используете ()
в turtle.onscreenclick( tur_race() )
, то у вас есть ситуация
result = tur_race()
turtle.onscreenclick( result )
который не работает в вашем коде, но может быть полезен в других ситуациях.
Ответ №4:
В дополнение ко всем ответам вам нужно добавить параметры x и y в функцию tur_race. Это потому, что turtle передает параметры x и y функции, поэтому ваш код будет выглядеть следующим образом:
from turtle import *
def tur_race(x, y):
for step in range(0, 135):
tur1.forward(randint(1, 5))
tur2.forward(randint(1, 5))
turtle.pu()
turtle.goto(-250, -150)
turtle.write("click the mouse to start")
turtle.ht()
turtle.onscreenclick(tur_race)
turtle.mainloop()