Как остановить функцию ‘turtle.onscreenclick’ нажатием клавиши?

#python #multithreading #multiprocessing #turtle-graphics

#python #многопоточность #многопроцессорная обработка #черепаха-графика

Вопрос:

Я создал простую программу, которая позволяет вам нажимать на экран, чтобы рисовать что-то с помощью turtle. Каждая точка, к которой вы перемещаетесь, записывается в массив. Я хочу записать этот массив в текстовый файл, используя JSON, когда пользователь закончит что-то рисовать.

 import turtle
from turtle import Turtle, Screen

pastMovementsX = [0]
pastMovementsY = [0]

screen = Screen()
screen.setup(500, 350)
screen.screensize(600, 600)

def move(x, y):
        moveto = turtle.goto(x, y)
        pastMovementsX.append(turtle.xcor())
        pastMovementsY.append(turtle.ycor())

turtle.onscreenclick(move) 
  

Любой код после turtle.onscreenclick() не будет выполняться. Я предполагаю, что он продолжает проверять наличие щелчка на экране и поэтому не может продолжить работу с программой.

Я попробовал пару вещей. Особенно многопоточность и многопроцессорность для этого. Это не сработало, и после небольшого исследования кажется, что модулю turtle не нравится или он плохо работает с потоковой обработкой / многопроцессорностью.

Как бы мне заставить программу остановиться turtle.onscreenclick() и продолжить работу с дальнейшим кодом после нажатия клавиши?

Ответ №1:

Любой код после turtle.onscreenclick() не будет выполняться. Я предполагаю, что он продолжает проверять наличие щелчка на экране и поэтому не может продолжить работу с программой.

Ваш вопрос недействителен, поскольку ваша предпосылка неверна:

 from turtle import Turtle, Screen

def move(x, y):
        moveto = turtle.goto(x, y)
        pastMovementsX.append(x)
        pastMovementsY.append(y)

pastMovementsX = [0]
pastMovementsY = [0]

screen = Screen()
screen.setup(500, 350)
screen.screensize(600, 600)

turtle = Turtle()

screen.onclick(move)

turtle.circle(50)

screen.mainloop()
  

onclick() Метод устанавливает функцию-обработчик и переходит к следующему оператору, он ничего не проверяет. Это делается циклом событий tkinter, который передается при последнем mainloop() вызове в программе.

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