Полотно Canvas
Canvas — это такое полотно или холст, в котором можно рисовать и двигать фигуры.
Начнём с шаблона приложения Tkinter:
############# БИБЛИОТЕКИ #############
import tkinter as tk
############# НАСТРОЙКИ ОКНА #############
window = tk.Tk()
window.title("Пример Canvas")
window.geometry("600x600")
############# ЭЛЕМЕНТЫ ОКНА #############
############# ЗАПУСК ОКНА #############
window.mainloop()
Python
Чтобы добавить canvas в блок элементов окна, пишется команда:
tk.Canvas(window, width=400, height=400, bg="white")
Python
Среди параметров полотна:
width— ширина полотна в пикселяхheight— высота полотна в пикселяхbg— цвет полотна
Таблица возможных цветов:
| Название цвета | Значение |
|---|---|
| Белый | "white" |
| Чёрный | "black" |
| Серый | "gray" |
| Светло-серый | "lightgray" |
| Тёмно-серый | "darkgray" |
| Красный | "red" |
| Тёмно-красный | "darkred" |
| Оранжевый | "orange" |
| Жёлтый | "yellow" |
| Зелёный | "green" |
| Светло-зелёный | "lightgreen" |
| Синий | "blue" |
| Тёмно-синий | "navy" |
| Голубой | "skyblue" |
| Фиолетовый | "purple" |
| Розовый | "pink" |
| Коричневый | "brown" |
| Бирюзовый | "turquoise" |
| Бежевый | "beige" |
Создаём canvas и размещаем его в окне командой pack():
############# БИБЛИОТЕКИ #############
import tkinter as tk
############# НАСТРОЙКИ ОКНА #############
window = tk.Tk()
window.title("Пример Canvas")
window.geometry("600x600")
############# ЭЛЕМЕНТЫ ОКНА #############
полотно = tk.Canvas(window, width=600, height=600, bg="skyblue")
полотно.pack()
############# ЗАПУСК ОКНА #############
window.mainloop()
Python
Добавление фигур
Фигуры на полотне рисуются командой:
ИМЯ_ПОЛОТНА.create_НАЗВАНИЕ_ФИГУРЫ(ПАРАМЕТРЫ)
Python
Моё полотно называется «полотно», вместо него пишем название своего canvas!
Координаты точек считаются с левого верхнего угла окна.
- Чем правее точка, тем больше её координата X
- Чем ниже точка — тем больше её координата Y
Прямоугольник — create_rectangle
прямоугольник = полотно.create_rectangle(50, 50, 150, 150, fill="lightblue", outline="black", width=3)
Python
- 50 — координата X первой точки
- 50 — координата Y первой точки
- 150 — координата X второй точки
- 150 — координата Y второй точки
fill— цвет заливкиoutline— цвет обводкиwidth— ширина обводки
Овал — create_oval
овал = полотно.create_oval(200, 50, 300, 150, fill="pink", outline="black", width=2)
Python
- 200 — координата X первой точки
- 50 — координата Y первой точки
- 300 — координата X второй точки
- 150 — координата Y второй точки
fill— цвет заливкиoutline— цвет обводкиwidth— ширина обводки
Линия — create_line
линия = полотно.create_line(50, 200, 300, 200, width=3, fill="green")
Python
- 50 — координата X первой точки
- 200 — координата Y первой точки
- 300 — координата X второй точки
- 200 — координата Y второй точки
width— ширина линии в пикселяхfill— цвет линии
Многоугольник — create_polygon
полотно.create_polygon(100, 250, 150, 350, 50, 350, fill="orange")
Python
- 100 — координата X первой точки
- 250 — координата Y первой точки
- 150 — координата X второй точки
- 350 — координата Y второй точки
- 50 — координата X третьей точки
- 350 — координата Y третьей точки
- … (можно добавить сколько угодно точек)
fill— цвет многоугольника
Надпись — create_text
текст = полотно.create_text(200, 380, text="Текст!", font=("Arial", 14))
Python
- 200 — координата X надписи
- 380 — координата Y надписи
text— текст надписиfont— параметры шрифта
СПЕЦЗАДАНИЕ ᕦ^•ω•^ᕤ
Клепаем рисунок на холсте по образцу!
Твоя задача: повторить рисунок с картинки ниже, используя команды:
create_rectangle— прямоугольникиcreate_oval— овалы и кругиcreate_line— линииcreate_polygon— многоугольники (треугольники)create_text— подписи
Образец для повторения:
✅ Работаем!!!
Удаление фигур
Команда удаления фигуры с полотна:
НАЗВАНИЕ_ПОЛОТНА.delete(ИМЯ_ФИГУРЫ)
Python
Команда удаления всех фигур с полотна:
НАЗВАНИЕ_ПОЛОТНА.delete("all")
Python
События при нажатии
Чтобы выполнять код по нажатию на клавишу используем команду bind:
window.bind("<КЛАВИША>", ИМЯ_ФУНКЦИИ)
Python
Примеры клавиш:
| Событие | Клавиша |
|---|---|
| Левая кнопка мыши | <Button-1> |
| Средняя кнопка мыши | <Button-2> |
| Правая кнопка мыши | <Button-3> |
| q | <q> |
| 1 | <1> |
| Enter | <Return> |
| Esc | <Escape> |
| Backspace | <BackSpace> |
| Tab | <Tab> |
| Пробел | <space> |
| Delete | <Delete> |
| Insert | <Insert> |
| Caps Lock | <Caps_Lock> |
| Shift (левая / правая) | <Shift_L> / <Shift_R> |
| Ctrl | <Control_L> / <Control_R> |
| Alt | <Alt_L> / <Alt_R> |
| Win / Command | <Super_L> / <Super_R> |
В аргументе функции должен быть event!
Пример удаления текста при нажатии на левую кнопку мыши:
def левая_кнопка(event):
полотно.delete(текст)
window.bind("<Button-1>", левая_кнопка)
Python
Пример удаления всех фигур при нажатии на клавишу пробел:
def пробел(event):
полотно.delete("all")
window.bind("<space>", пробел)
Python
Задания по событиям ≽^◕ ˕ ◕^≼
- Создай полотно и нарисуй на нём три фигуры
- Сделай так, чтобы по нажатию на Ctrl все фигуры удалялись
- Сделай так, чтобы по нажатию на Esc окно закрывалось
Рисование фигуры по нажатию
Чтобы рисовать фигуры по клику мышкой — используем следующий код:
def левый_клик(event):
x = event.x
y = event.y
размер = 100
полотно.create_rectangle(x, y, x+размер, y+размер, fill="blue", outline="black", width=2)
полотно.bind("<Button-1>", левый_клик)
Python
Здесь event.x и event.y — точка на канвасе, на которую кликнули мышкой, а размер — переменная размера фигуры.
Задания по рисованию ฅ^•ω•^ฅ
- Сделай так, чтобы по клику левой кнопкой мыши рисовался кружочек (а не квадратик)
- Добавь второй клик — по правой кнопке мыши (
<Button-3>) всё полотно очищается - Сделай так, чтобы размер фигуры зависел от того, куда кликнули (например, ближе к краю — меньше фигура)
Движение фигуры по нажатию
Для перемещения фигур используется функция move:
НАЗВАНИЕ_ПОЛОТНА.move(НАЗВАНИЕ_ФИГУРЫ, СДВИГ_ПО_Х, СДВИГ_ПО_У)
Python
- На сколько пикселей двигаем вправо — первый параметр
- На сколько пикселей двигаем вниз — второй параметр
Например, у вас есть фигура кружочек:
кружочек = полотно.create_oval(50, 50, 300, 300, fill="pink")
Python
Чтобы по нажатию на стрелку вправо двигать кружочек вправо, используем код:
def двигаем_вправо(event):
полотно.move(кружочек, 10, 0)
window.bind("<Right>", двигаем_вправо)
Python
- Стрелка вправо —
<Right> - Стрелка влево —
<Left> - Стрелка вверх —
<Up> - Стрелка вниз —
<Down>
Чтобы подвинуть фигуру вверх при нажатии на стрелку вверх, используем код:
def двигаем_вверх(event):
полотно.move(кружочек, 0, -10)
window.bind("<Up>", двигаем_вверх)
Python
Задания по движению ≽^◕ ˕ ◕^≼
- Нарисовать фигуру на полотне и сделать движение на все четыре стрелки:
- ⬆️ вверх —
<Up> - ⬇️ вниз —
<Down> - ⬅️ влево —
<Left> - ➡️ вправо —
<Right>
- ⬆️ вверх —
- Сделай так, чтобы фигура двигалась быстрее (например, на 20 пикселей за нажатие)
- Добавь движение по диагонали — например, при нажатии
<w>фигура едет вверх-вправо
СПЕЦЗАДАНИЕ ᕦ^•ω•^ᕤ
Клепаем мини-игру на Canvas!
Что должно быть:
tk.Canvas— полотно 600x600- Нарисован кружочек (или квадратик) — это «герой»
- Стрелки
<Up>,<Down>,<Left>,<Right>двигают героя - По нажатию на пробел — очищается полотно
- По нажатию на левую кнопку мыши — рисуется новая фигура в месте клика
- По нажатию на правую кнопку мыши — удаляются все фигуры
Пример готовой игры:
✅ Работаем!!!