Python с использованием кнопки черепахи

Я пытаюсь выполнить домашнее задание по реализации Саймона Сэйса на Python. Пытаюсь сделать это с помощью библиотеки черепахи (обязательное требование).

Однако я столкнулся с камнем преткновения в том, что, хотя я могу заставить экран регистрировать события щелчка (в настоящее время просто печатаю координаты x, y), я не могу заставить его ждать события щелчка.

В частности, то, что я планирую сделать, - это иметь области на экране, которые, когда они щелкают в этом месте, считаются, как если бы они нажали кнопку. Экран очищается, и игра делает что угодно.

Однако в экспериментах с попытками получить работающую «кнопку» все, что он делает, - это настраивает ее так, чтобы она печатала координаты x, y, но остальная часть программы завершается. Не ждал, пока пользователь что-нибудь щелкнет. Пробовал метод блокировки ...

while clicked == False:
    pass

or

while clicked == False:
    time.sleep(1)

но оба метода вешают программу, пока я не прерву ее вручную, а затем она распечатает щелчки.

Я где-то упускаю возможность?


person user2309351    schedule 17.11.2013    source источник
comment
вы не проверяете нажатие кнопки?   -  person PurityLake    schedule 17.11.2013
comment
Насколько я знаю, у черепахи нет кнопок. Я пытаюсь имитировать эффект. Если есть кнопка для черепахи, я хотел бы знать о ней.   -  person user2309351    schedule 18.11.2013
comment
Я никогда не использовал черепах, но есть метод turtle.onrelease(fun, btn=1, add=None), я уверен, что если вы воспользуетесь им, вы сможете сделать кнопку, просто проверьте координаты x, y?   -  person PurityLake    schedule 18.11.2013
comment
Это вызывает прикрепленную функцию. Но программа не ждет. Скажем, у меня 2 кнопки. Программа ожидает, что я буду подталкивать то или иное. Я делаю 'turtle.onrelease', 'turtle.onclick' или что-то еще, что вызовет функцию, но программа уже вылетела бы, так как ожидаемые переменные равны нулю, потому что она настроила ее на использование этой функции, а затем продолжила.   -  person user2309351    schedule 18.11.2013
comment
ну так это проблема с резьбой? извините, если я неправильно интерпретирую   -  person PurityLake    schedule 18.11.2013
comment
Эта страница может помочь с общей проблемой кнопок Python черепах: repl.it/@ssinha_tesp /Turtle-Buttons#main.py   -  person tonethar    schedule 28.05.2020


Ответы (3)


У черепах нет кнопок, но у них есть обратные вызовы для кликов. Кроме того, вы должны использовать onclick для Screen для обнаружения общих щелчков и onclick для turtle для обнаружения щелчков в черепахах. Вы можете, например, сделать 4 БОЛЬШИХ черепахи разного цвета, используя динамическую форму.

Кроме того, черепаха основана на Tk, поэтому вы должны знать о таких вещах, как mainloop()

Следующая программа дает некоторые подсказки для Python 2.7.5.

import turtle as t
from random import randint

class MyTurtle(t.Turtle) :

    def __init__(self,**args) :
        t.Turtle.__init__(self,**args)

    def mygoto(self,x,y) :
        t1.goto(x,y)
        print x,y

    def randonics(self,x,y) :
        self.left(randint(90,270))

def minegoto(x,y) :
    print x,y
    t1.goto(x,y)

wt=t.Screen()
t1=MyTurtle()
wt.register_shape("big",((0,0),(30,0),(30,30),(0,30)))
t1.shape("big")
wt.onclick(t1.mygoto,btn=1)
wt.onclick(minegoto,btn=2)
t1.onclick(t1.randonics,btn=3)
t1.goto(100,100)

t.mainloop()
person Xexeo    schedule 18.11.2013
comment
Это то, что я смог сделать. Однако я хочу, чтобы программа перестала выполняться, удерживалась до тех пор, пока не было зарегистрировано событие щелчка, выясняла, где был этот щелчок, и выполняла некоторый код в зависимости от того, где щелкнул пользователь. Фактически кнопка. Это может потребовать многопоточности, как кто-то предложил выше, но есть только один путь через программу (путь, определяемый пользователем), но только один. Если только t.mainloop () не сделает что-то особенное, что мне не хватает? - person user2309351; 20.11.2013
comment
Вы можете зарегистрировать функцию с помощью onclick (), чтобы проверить положение x, y. Если он находится внутри какого-то региона, вы делаете все, что должны. Я не вижу разницы между тем, что вы хотите сделать, и тем, что делает этот код, изменение положения черепахи - это просто пример, вы можете делать что угодно, когда щелчок фиксируется onclick (), даже запускать поток, если вы действительно нужно это. - person Xexeo; 23.11.2013

Таким образом, после обширного поиска не обязательно приостанавливать выполнение кода в python при использовании черепахи для ожидания какого-либо события щелчка. Может быть, в Tk я мог бы это сделать, но не в черепахе.

Однако есть способ обойти это. Например. Метод устанавливает поддельную кнопку на экране, устанавливает событие щелчка и завершает работу. Событие щелчка при нажатии вызывает следующий метод, необходимый для выполнения. Таким образом, пока кнопка не нажата, фактический код ничего не делает, а остается в памяти для использования.

Так что конкретнее. 1. Создайте «кнопку». 2. Пусть ваша программа ведет себя нормально, пока ей не придется ждать события щелчка. 3. Настройте щелчок на экране (или на черепахе) таким образом, чтобы при нажатии «кнопки» запускалась следующая часть кода.

Специальное примечание. Рассматриваемый код не может зависеть от ожидания события щелчка позже в коде. Вместо этого щелчок вызывает следующую часть выполнения вашего кода.

person user2309351    schedule 21.11.2013

Вы можете зарегистрировать функцию с помощью onclick (), чтобы проверить положение x, y. Если он находится внутри какого-то региона, вы делаете все, что должны.

Я не вижу разницы между тем, что вы хотите сделать, и тем, что делает этот код, изменение положения черепахи - это просто пример, вы можете делать что угодно, когда щелчок фиксируется onclick (), даже запускать поток, если вы действительно нужно (используя создание потоков в python)

import turtle as t
from random import randint
from threading import Thread
from time import sleep

def threaded_function(arg,t1):
    for i in range(arg):
        print "running",i
        sleep(1)
        t1.forward(i*10)



def minegoto(x,y) :
    print x,y
    t1.goto(x,y)
    thread = Thread(target = threaded_function, args = (10,t1 ))
    thread.start()
    thread.join()
    print "thread finished...exiting"

wt=t.Screen()
t1=t.Turtle()
wt.register_shape("big",((0,0),(30,0),(30,30),(0,30)))
t1.shape("big")
wt.onclick(minegoto,btn=1)
t1.goto(100,100)

t.mainloop()
person Xexeo    schedule 22.11.2013