Методы onclick и onscreenclick модуля turtle языка Python. События клика по черепахе и холсту
Словарь урока
из модуля turtle: |
|
---|---|
из языка Python: |
|
Ранее мы уже говорили о событиях, которые может обрабатывать программа. Речь шла о нажатиях клавиш на клавиатуре, которые отслеживаются методом onkey
. Однако события могут быть связаны с мышью, кликами ее кнопок. В таком случае в модуле turtle языка Python используются методы onclick
и onscreenclick
. Первый предназначен для обработки кликов по черепахе, второй ‒ по экрану (холсту).
Рассмотрим программу, в которой черепаха переходит в позицию клика по холсту, а клик по ней самой заставляет ее рисовать окружность.
turtlesize(3) shape('turtle') fillcolor('darkgreen') def point_to_teleport(a, b): teleport(a, b) def turtle_draw(a, b): circle(50) onscreenclick(point_to_teleport) onclick(turtle_draw)
Методы onscreenclick
и onclick
в качестве первого аргумента принимают имя функции, код которой будет выполняться при наступлении соответствующего события. При этом есть правило, что такие функции должны принимать два аргумента, то есть там, где они определяются, иметь два параметра. Этим параметрам, невидимо для нас, присваиваются координаты клика.
В примере параметру a
присвоится координата x места клика мышью, параметру b
‒ координата y. Использовать эти поступившие в функцию данные не обязательно. Так они нам нужны для телепортации, но не для рисования круга.
Допустим, мы хотим, чтобы было две черепахи, одна из которых рисует круги, а другая ‒ треугольники. Как реализовать такое? Проще всего воспользоваться возможностью при вызове методов onclick
и onscreenclick
указывать, клик какой именно клавишей мыши они должны обрабатывать. Для этого надо передать второй аргумент ‒ число 1, 2 или 3. Число 1 используется для левой клавиши мыши, его можно не передавать, так как оно присвоено по-умолчанию. 2 ‒ это средняя клавиша, и 3 ‒ правая.
gt = Turtle() gt.turtlesize(3) gt.shape('turtle') gt.fillcolor('darkgreen') bt = Turtle() bt.turtlesize(3) bt.shape('turtle') bt.fillcolor('blue') def gt_teleport(a, b): gt.teleport(a, b) def bt_teleport(a, b): bt.teleport(a, b) def gt_draw(a, b): gt.circle(50) def bt_draw(a, b): bt.circle(50, steps=3) onscreenclick(gt_teleport) onscreenclick(bt_teleport, 3) gt.onclick(gt_draw) bt.onclick(bt_draw, 3)
Для пользователя такое поведение программы не очевидно. Мы привыкли совершать действия левой клавишей мыши. Поэтому можно сделать по-другому. Пусть активность между черепахами переключается с помощью клавиши пробела на клавиатуре. Телепортироваться и рисовать будет только активная. В таком случае мы сможем использовать только левую клавишу мыши для обоих черепах.
gt = Turtle() gt.shape('circle') gt.teleport(-50, 0) bt = Turtle() bt.shape('square') n = 1 def who_active(): global n if n == 1: onscreenclick(gt_teleport) gt.onclick(gt_draw) gt.fillcolor('yellow') bt.fillcolor('black') bt.onclick(None) n = 2 else: onscreenclick(bt_teleport) bt.onclick(bt_draw) bt.fillcolor('orange') gt.fillcolor('black') gt.onclick(None) n = 1 def gt_teleport(a, b): gt.teleport(a, b) def bt_teleport(a, b): bt.teleport(a, b) def gt_draw(a, b): gt.circle(50) def bt_draw(a, b): bt.circle(50, steps=3) onkey(who_active, 'space') listen()
В этом коде, когда нажимается пробел, срабатывает функция who_active
. В ней в зависимости от значения переменной n
мы привязываем к onscreenclick
либо функцию телепортации одной черепахи, либо другой. От неактивной черепахи следует отвязывать функцию, которая выполняется при кликах по ней. Если этого не сделать, то при клике по ней она будет рисовать, хотя не будет телепортироваться. Вместо этого на место, где она рисует, телепортируется активная черепаха. Для отвязывания функции от события используется объект None
языка Python, который передается в метод.
Задания для самостоятельной работы
- Переделайте первую программу из урока так, чтобы при щелчке по холсту черепаха не только телепортировалась в это место, но и сразу рисовала там круг.
- Напишите код, в котором при кликах по холсту, черепаха перемещается в место клика с помощью команды
goto
. - Попробуйте реализовать программу, в которой при кликах по черепахе, только она меняет цвет, а при кликах по холсту меняется его цвет. Обратите внимание, что клик по черепахе означает и клик по холсту.