В материале представлены команды, отвечающие за прослушивание событий мыши и клавиатуры для активного холста в модуле turtle
.
turtle.listen()
прослушивает события холста,turtle.onkey()
связывает функцию с отпусканием клавиши,turtle.onkeyrelease()
связывает функцию с отпусканием клавиши,turtle.onkeypress()
связывает функцию с нажатием клавиши,turtle.onclick()
связывает функцию с нажатием клавиши,turtle.onscreenclick()
событие нажатия клавиши,turtle.ontimer()
запускает функцию через какое то время,turtle.mainloop()
предотвращает закрытие холста,turtle.done()
предотвращает закрытие холста,turtle.listen(xdummy=None, ydummy=None)
:Метод turtle.listen()
устанавливает фокус на текущий холст TurtleScreen
для прослушивания событий. Для передачи listen () методу onclick предоставляются фиктивные аргументы.
Необязательные аргументы xdummy
и ydummy
координаты области, которая прослушивается, если они не заданы, то слушаются события всего холста.
turtle.onkey(fun, key)
,turtle.onkeyrelease(fun, key)
:Методы turtle.onkey()
и turtle.onkeyrelease()
связывает функцию fun
с событием отпускания клавиши key
.
Если аргумент fun
имеет значение None
, то привязки событий удаляются.
Примечание: чтобы иметь возможность регистрировать события клавиатуры, холст TurtleScreen
должен иметь фокус, который устанавливается методом `turtle.listen().
Аргументы:
fun
: функция без аргументов или None
.fun
: строка: название клавиши (например 'Space'
, 'Up'
) или символ клавиши (например 'a'
).Пример:
import turtle screen = turtle.Screen() pen = turtle.Turtle() def f(): pen.fd(50) pen.lt(60) screen.listen() # нажатие стрелки вверх screen.onkey(f, "Up") # клавиша `X` для выхода screen.onkey(lambda: turtle.bye(), "x") turtle.done()
turtle.onkeypress(fun, key=None)
:Метод turtle.onkeypress()
связывает вызов функции fun
с событием нажатия клавиши, если клавиша key
задана, или к событию нажатия любой клавиши, если клавиша key
не указана.
Примечание: чтобы иметь возможность регистрировать события клавиатуры, холст TurtleScreen
должен иметь фокус, который устанавливается методом `turtle.listen().
Аргументы:
fun
: функция без аргументов или None
.fun
: строка: название клавиши (например 'Space'
, 'Up'
) или символ клавиши (например 'a'
).import turtle screen = turtle.Screen() # слушаем события screen.listen() # нажатие на любую клавишу закроет холст screen.onkeypress(lambda: turtle.bye()) turtle.done()
turtle.onclick(fun, btn=1, add=None)
,turtle.onscreenclick(fun, btn=1, add=None)
:Методы turtle.onclick
и turtle.onscreenclick()
связывает вызов функции fun
с событием щелчка мышью на этом холсте. Если fun
имеет значение None
, то существующие привязки удаляются.
Аргументы:
fun
: функция, которая будет вызываться с координатами точки щелчка на холсте x
и y
.btn
: номер кнопки мыши, по умолчанию 1 (левая кнопка мыши).add
: если True
, будет добавлена новая привязка, в противном случае она заменит прежнюю привязку.Пример экземпляра холста TurtleScreen
с именем screen
и экземпляра Turtle
с именем pen
:
>>> import turtle >>> screen = turtle.Screen() >>> pen = turtle.Turtle() # нажатие на холст `TurtleScreen` заставит перо # переместиться в точку, по которой щелкнули мышью. >>> screen.onclick(pen.goto) # удаляем привязку событий щелка мышью >>> screen.onclick(None)
Примечание. Этот метод TurtleScreen
доступен как глобальная функция только под именем screen.onscreenclick()
. Глобальная функция onclick()
является еще одной производной от метода модуля turtle.onclick()
.
turtle.ontimer(fun, t=0)
:Метод turtle.ontimer()
устанавливает таймер, который вызывает функцию fun
через t
миллисекунд.
import turtle def around(): if running: pen.fd(50) pen.lt(60) screen.ontimer(around, 250) screen = turtle.Screen() pen = turtle.Turtle() # заставит перо рисовать/ходить по кругу >>> run = True >>> around() # присвоение `run = False` остановит перо >>> run = False
turtle.mainloop()
,turtle.done()
:Методы turtle.mainloop()
и turtle.done()
запускают цикл обработки событий, т.е. происходит вызов функции основного цикла Tkinter
. Другими словами, предотвращает закрытие холста по завершении сценария.
Должен быть последним оператором в графической программе. Не должен использоваться, если сценарий запускается из IDLE в режиме -n
- для интерактивного использования графики turtle
.
>>> import turtle >>> screen = turtle.Screen() >>> screen.mainloop()
В примере рисуется кнопка с надписью. После нажатия на кнопку мышкой, появляется кружок, который можно перемещать при помощи стрелок клавиатуры.
import turtle def btnclick(x, y): """Клик по кнопке""" px, py = btn.pos() # проверяем попадают ли координаты # клика по холсту в координаты кнопки if px<x<px+btn_width and py<y<py+btn_height: # стираем кнопку btn.clear() # показываем круг circ.showturtle() circ.penup() def draw_bth(width, height, pos=(0.00, 0.00), text=""): """Кнопка с надписью""" btn.penup() btn.setpos(pos) btn.pendown() # рисуем прямоугольник for i in range(4): if i in [1,3]: btn.fd(height) else: btn.fd(width) btn.left(90) # поднимаем перо btn.penup() # перемещаем перо внутрь прямоугольника btn.sety(btn.ycor() + height/2 - 12) btn.setx(btn.xcor() + 5) # выводим надпись btn.write(text, font=("Arial", 12, "normal")) # Настраиваем окно модуля screen = turtle.Screen() screen.setup(1000, 600) # создаем объект пера, который будет кругом circ = turtle.Turtle() # скрываем перо circ.hideturtle() # придаем объекту форму круга circ.shape("circle") circ.color("orange") # объект пера, который будет кнопкой btn = turtle.Turtle() # скрываем перо btn.hideturtle() # размеры кнопки btn_width = 100 btn_height = 30 # позиция кнопки на холсте pos = (-100, 100) # рисуем кнопку draw_bth(btn_width, btn_height, pos, 'Нажми меня.') # прослушиваем события активного холста screen.listen() # клик мышки по кнопке screen.onscreenclick(btnclick, 1) # нажатия стрелок клавиатуры # (перемещение круга по холсту) screen.onkeypress(lambda: circ.sety(circ.ycor() + 10), 'Up') screen.onkeypress(lambda: circ.sety(circ.ycor() - 10), 'Down') screen.onkeypress(lambda: circ.setx(circ.xcor() + 10), 'Right') screen.onkeypress(lambda: circ.setx(circ.xcor() - 10), 'Left') # Для закрытия холста нужно нажать любую # НЕ зарегистрированную выше клавишу screen.onkeypress(lambda: turtle.bye()) turtle.mainloop()