Глава 18 · Проект: приложение для рисования

Получаем позицию мыши

События мыши позволяют превратить движение курсора в настоящую линию на холсте.

Получаем позицию мыши

Как и в главе 17, реагировать на мышь помогает .bind() — только вместо клавиатурных событий здесь события мыши: <Button-1> (нажатие левой кнопки), <B1-Motion> (движение с зажатой левой кнопкой), <ButtonRelease-1> (кнопку отпустили).

poziciya_myshi.py
def pokazat_poziciyu(event):
    pozicia_label.config(text=f"x={event.x}, y={event.y}")

canvas.bind("<Motion>", pokazat_poziciyu)

event.x и event.y — координаты курсора относительно холста, в тех же единицах, что и у самого Canvas.

Рисуем линии

Три события вместе создают эффект «рисования от точки до точки»: запоминаем начало на <Button-1>, рисуем линию к текущей позиции на каждом <B1-Motion>:

risuem_linii.py
start_x, start_y = None, None

def nachalo_risovaniya(event):
    global start_x, start_y
    start_x, start_y = event.x, event.y

def vo_vremya_risovaniya(event):
    canvas.create_line(start_x, start_y, event.x, event.y, fill=tekuschij_cvet, width=tolschina)

canvas.bind("<Button-1>", nachalo_risovaniya)
canvas.bind("<B1-Motion>", vo_vremya_risovaniya)
create_line — как forward() у Turtle, только по координатам
canvas.create_line(x1, y1, x2, y2) рисует прямую между двумя точками — концептуально то же самое, что goto() у Turtle из главы 6, только без «черепашки», которая сама туда едет.
Практика в Jupyter Notebook
18-04-linii.ipynb · позиция мыши и рисование линий
Открыть ноутбук →