turtle.onclick () не работает так, как должно - PullRequest
3 голосов
/ 06 апреля 2019

У меня есть скрипт для простой гонки черепах, и я хочу, чтобы гонка начиналась, когда пользователь нажимает левую кнопку мыши, поэтому у меня есть этот код

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

Предположим, что у меня определены все переменные.

когда я запускаю этот код, гонка начинается автоматически и не ждет клика.

Ответы [ 3 ]

3 голосов
/ 06 апреля 2019

onscreenclick принимает функцию в качестве параметра. Вы не должны звонить tur_race, черепаха будет делать это, когда есть щелчок, скорее вы должны передать tur_race сам. Это называется обратным вызовом, вы предоставляете функцию или метод для вызова некоторым прослушивателем событий (например, щелчком мыши по экрану).

2 голосов
/ 06 апреля 2019

В дополнение к отличному ответу @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.В противном случае он будет вызван немедленно.

Надеюсь, это поможет !!

1 голос
/ 07 апреля 2019

Вам нужно turtle.onscreenclick( tur_race ) без () после tur_race


Python может присвоить имя функции (без () и аргументы) переменной и использовать его позже - как в примере

show = print
show("Hello World")

Он также может использовать имя функции в качестве параметра в другой функции, и эта функция будет использовать его позже.

Offen (на разных языках программирования) имя этой функции называется "callback"

В turtle.onscreenclick( tur_race ) вы отправляете имя функции onscreenclick, и turtle будет использовать эту функцию позже - когдаВы нажимаете на экран.


Если вы используете () в turtle.onscreenclick( tur_race() ), то возникает ситуация

result = tur_race()
turtle.onscreenclick( result )

, которая не работает в вашем коде, но может быть полезна в другомситуаций.

...