Сообщить об ошибке.

События клавиатуры и мыши для холста в модуле turtle Python

Использование событий клавиатуры и мыши для холста/экрана

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

Содержание:


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()