Виджет Tkinter Canvas в Python — создание холста

Виджет Canvas — самый гибкий виджет в Tkinter.

Содержание

Что такое виджет Canvas Tkinter в Python?

Виджет холста позволяет вам создавать что угодно: от пользовательских виджетов до полноценных пользовательских интерфейсов.

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

Чтобы создать виджет Canvas, вы создаете новый экземпляр класса Canvas из модуля tkinter. Например, следующий код создает холст в окне:

import tkinter as tk

root = tk.Tk()
root.geometry('800x600')
root.title('Canvas Demo')

canvas = tk.Canvas(root, width=600, height=400, bg='white')
canvas.pack(anchor=tk.CENTER, expand=True)

root.mainloop()

Выход:

Виджет Canvas создает холст в окне

Как это работает.

  • Сначала создайте новый объект Canvas шириной 600 пикселей, высотой 400 пикселей и белым фоном:
canvas = tk.Canvas(root, width=600, height=400, bg='white')
  • Во-вторых, поместите объект canvas в корневое окно, используя геометрию pack().
canvas.pack(anchor=tk.CENTER, expand=True)

У холста есть система координат, как у окна. Начало координат(0,0) находится в верхнем левом углу. Направление оси x — слева направо, а направление оси y — сверху вниз.

Добавление элементов на холст с помощью методов create_*

Объект canvas имеет ряд методов add_*. Эти методы позволяют размещать на нем элементы. Элементы:

Элемент Метод
Линия create_line()
Прямоугольник create_rectangle()
Овал create_oval()
Дуга create_arc()
Многоугольник create_polygon()
Текст create_text(()
Изображение create_image()

Создание линии

Для создания линии используется метод create_line(). Например, следующий код создает красную линию:

canvas.create_line((50, 50),(100, 100), width=4, fill='red')

Выход:

Пример создания линии

В этом примере линия состоит из двух точек(50,50) и(100,100). Метод create_line() соединяет точки между этими точками.

Аргумент width определяет ширину линии, а аргумент fill определяет цвет линии.

Создание прямоугольника

Чтобы нарисовать прямоугольник, используйте метод create_rectangle(). Например:

import tkinter as tk

root = tk.Tk()
root.geometry('800x600')
root.title('Canvas Demo - Rectangle')

canvas = tk.Canvas(root, width=600, height=400, bg='white')
canvas.pack(anchor=tk.CENTER, expand=True)

canvas.create_rectangle((100, 100),(300, 300), fill='green')

root.mainloop()

Выход:

Создание прямоугольника с помощью метода create_rectangle()

Добавление овала

Чтобы нарисовать овал, используйте метод create_oval(). Например:

import tkinter as tk

root = tk.Tk()
root.geometry('800x600')
root.title('Canvas Demo - Oval')

canvas = tk.Canvas(root, width=600, height=400, bg='white')
canvas.pack(anchor=tk.CENTER, expand=True)

 points =(
   (50, 150),
   (200, 350),
)
canvas.create_oval(*points, fill='purple')

root.mainloop()

Выход:

Пример использования метода create_oval()

Как и прямоугольник, овал принимает координаты верхнего левого и нижнего правого углов своего ограничивающего прямоугольника. Ограничивающий прямоугольник овала — это наименьший прямоугольник, содержащий овал.

В этом примере верхний левый и нижний правый углы ограничивающей рамки имеют координаты(50,150) и(200,350).

Создание овала

Многоугольник на холсте

Чтобы нарисовать многоугольник, используйте метод create_polygon(). Например:

import tkinter as tk

root = tk.Tk()
root.geometry('800x600')
root.title('Canvas Demo - Polygon')

canvas = tk.Canvas(root, width=600, height=400, bg='white')
canvas.pack(anchor=tk.CENTER, expand=True)


# create a polygon
points =(
   (100, 300),
   (200, 200),
   (300, 300),
)
canvas.create_polygon(*points, fill='blue')

root.mainloop()

Выход:

Многоугольник с методом create_polygon()

Отображение текста

Чтобы разместить текст на холсте, используйте метод create_text(). Например:

import tkinter as tk

root = tk.Tk()
root.geometry('800x600')
root.title('Canvas Demo - Text')

canvas = tk.Canvas(root, width=600, height=400, bg='white')
canvas.pack(anchor=tk.CENTER, expand=True)


canvas.create_text(
   (300, 100),
    text="Canvas Demo",
    fill="orange",
    font='tkDefaeultFont 24'
)

root.mainloop()

Выход:

Пример размещения текста на холсте

Как нарисовать дугу

Чтобы нарисовать дугу на холсте, используйте метод create_arc(). Например:

import tkinter as tk
from turtle import width

root = tk.Tk()
root.geometry('800x600')
root.title('Canvas Demo - Arc')

canvas = tk.Canvas(root, width=600, height=600, bg='white')
canvas.pack(anchor=tk.CENTER, expand=True)

canvas.create_arc((10, 10),(200, 200), style=tk.PIESLICE, width=2)
canvas.create_arc((10, 200),(200, 390), style=tk.CHORD, width=2)
canvas.create_arc((10, 400),(200, 590), style=tk.ARC, width=2)


root.mainloop()

Выход:

Пример создания дуг

Размещение изображения

Чтобы разместить изображение на холсте, используйте метод create_image(). Например:

import tkinter as tk

root = tk.Tk()
root.geometry('800x600')
root.title('Canvas Demo - Image')

canvas = tk.Canvas(root, width=600, height=400, bg='white')
canvas.pack(anchor=tk.CENTER, expand=True)

python_image = tk.PhotoImage(file='python.gif')
canvas.create_image(
   (100, 100),
    image=python_image
)

 root.mainloop()

Выход:

Размещение изображения с помощью метода create_image()

Обратите внимание: если вы передадите PhotoImage непосредственно в метод create_image(), изображение не отобразится, поскольку оно автоматически удаляется сборщиком мусора.

Следующий код не будет работать:

canvas.create_image(
   (100, 100),
    image=tk.PhotoImage(file='python.gif')
)

Привязка события к элементу

Все методы create_* возвращают строковое значение, которое идентифицирует элемент в контексте объекта Canvas. И вы можете использовать это значение для привязки события к элементу.

Чтобы привязать событие к элементу, используйте метод tag_bind() объекта Canvas. Например:

import tkinter as tk

root = tk.Tk()
root.geometry('800x600')
root.title('Canvas Demo - Binding Event')

canvas = tk.Canvas(root, width=600, height=400, bg='white')
canvas.pack(anchor=tk.CENTER, expand=True)

python_image = tk.PhotoImage(file='python.gif')
image_item = canvas.create_image(
   (100, 100),
    image=python_image
)
canvas.tag_bind(
    image_item,
    '<Button-1>',
    lambda e: canvas.delete(image_item)
)

root.mainloop()

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

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *