#python #turtle-graphics #python-turtle
Вопрос:
Я пытаюсь написать программу, которая позволяет мне строить некоторые простые координаты с помощью модуля turtle, и, чтобы сделать его более удобным для пользователя, я хотел отображать крестик каждый раз, когда пользователь нажимал левую кнопку мыши, чтобы построить точку. По какой-то причине последний бит функции cross (), т. е. последняя линия креста не будет нарисована и не появится до тех пор, пока левая кнопка мыши не будет нажата снова. Я действительно не понимаю, почему это происходит, потому что код определенно выполняется. Любая помощь была бы вам очень признательна!
wn = t.Screen() wn.title("graph") wn.setup(width=600, height=600) wn.tracer(0) wn.update() pen = t.Turtle() pen.color("black") pen.shape("classic") pen.goto(0, 0) pen.ht() x = 10 y = 10 def cross(x, y): print(x, y) pen.pensize(2.5) pen.pu() pen.goto(x, y) pen.pd() pen.seth(225) pen.color("red") pen.fd(50) pen.color("black") pen.pu() pen.goto(x, y) pen.pd() pen.left(180) pen.fd(50) pen.pu() pen.goto(x, y) pen.seth(315) pen.pd() pen.color("green") pen.fd(50) pen.pu() pen.goto(x, y) pen.left(180) pen.pd() pen.color("yellow") pen.fd(50) #for some reason this is not being done print("now") cross(x, y) while True: wn.update() wn.onscreenclick(cross) wn.mainloop()
Ответ №1:
Этот код указывает на элементарное непонимание того, что onscreenclick()
и mainloop()
как делать:
while True: wn.update() wn.onscreenclick(cross) wn.mainloop()
Давайте переработаем код, чтобы правильно использовать эти методы, и исправим проблему:
from turtle import Screen, Pen def cross(x, y): screen.onclick(None) # disable handler inside handler pen.penup() pen.goto(x, y) pen.pendown() pen.setheading(225) pen.color('red') pen.forward(50) pen.penup() pen.goto(x, y) pen.pendown() pen.left(180) pen.color('black') pen.forward(50) pen.penup() pen.goto(x, y) pen.seth(315) pen.pendown() pen.color('green') pen.forward(50) pen.penup() pen.goto(x, y) pen.left(180) pen.pendown() pen.color('yellow') pen.forward(50) screen.update() screen.onclick(cross) # reenable handler on exit screen = Screen() screen.title("graph") screen.setup(width=600, height=600) screen.tracer(0) pen = Pen() pen.hideturtle() pen.color('black') pen.pensize(2.5) x, y = 10, 10 screen.onclick(cross) cross(x, y) screen.mainloop()
Как правило, я бы избегал использования tracer()
и update()
до тех пор, пока ваш код в основном не заработает. Ввод их с самого начала усложняет отладку вашего кода.
Комментарии:
1. Эй, спасибо, что нашли время помочь мне! Решение сработало, но у меня есть пара вопросов, если вы не возражаете. Что делает отключение обработчика в начале и включение его в конце функции? Также есть ли особая причина для определения таких объектов, как «экран» после функции? Наконец, у меня сложилось впечатление, что программа не может зацикливаться сама по себе, т. Е. он проходит через код один раз и завершается. Вот почему я добавил цикл «пока верно». Разве это не так? Не могли бы вы объяснить, как он зацикливается без определенного цикла. Еще раз большое спасибо за вашу первоначальную помощь!
2. @ineedpythonhelppls, отключая хандер в начале и подключая его в конце, не позволяет пользователю начинать новый крест, пока вы все еще рисуете предыдущий (т. Е. Агрессивные кликеры). Предотвращает искусственную рекурсию и беспорядочную графику.
3. @ineedpythonhelppls, я обычно определяю сущности Python в определенном порядке. Сначала импортируется, затем константы, затем функции и, наконец, код, который использует все вышеперечисленное. Есть исключения.
4. @ineedpythonhelppls, когда программа turtle вызывает
mainloop()
ее, она передает управление циклу событий tkinter, который постоянно зацикливается и проверяет входящие события. При использованииwhile True:
вы потенциально можете пропустить входящие события.