turtle.onclick() работает не так, как предполагалось

#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()