Canvas
Виджет Canvas предоставляет возможности рисования двухмерных фигур. Стоит отметить, что Canvas есть только в пакете tkinter , а в пакете tkinter.ttk аналог отсутствует.
Некоторые основные параметры Canvas:
- bg / background : фоновый цвет
- bd / border : граница
- borderwidth : толщина границы
- cursor : курсор
- height : высота виджета
- width : ширина виджета
По умолчанию Canvas представляет прямоугольную область:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x300") canvas = Canvas(bg="white", width=250, height=250) canvas.pack(anchor=CENTER, expand=1) root.mainloop()
Для двухмерного рисования Canvas предоставляет ряд методов:
- create_line() : рисует линию
- create_rectangle() : рисует прямоугольник
- create_oval() : рисует овал
- create_arc() : рисует дугу
- create_polygon() : рисует многоугольник
- create_text() : добавляет текст
- create_image() : добавляет изображение
- create_window() : добавляет виджет
В качестве результата все эти методы возвращают идентифтикатор добавленного элемента. Этот идентификатор в дальнейшем может использоваться для управления элементом. Рассмотрим применение этих методов.
Создание линии
Для рисования линии применяется метод create_line() . Для вывода линии необходимо как минимум задать координаты точек, например:
create_line(__x0: float, __y0: float, __x1: float, __y1: float)
Параметры __x0 и __y0 представляют координаты начальной точки линии, а __x1 и __y1 — конечной.
Началом координат в Canvas считается верхней левый угол виджета — это точка с координатами (0,0). Таким образом, ось X направлена вправо, а ось Y — вниз.
Нарисуем простейшую линию:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x300") canvas = Canvas(bg="white", width=250, height=250) canvas.pack(anchor=CENTER, expand=1) canvas.create_line(10, 10, 200, 50) root.mainloop()

Кроме того у данного метода можно выделить ряд дополнительных параметров:
- arrow : помещает стрелку в начале линии (значение first), в конце (last) или на обоих концах (both)
- arrowshape : позволяет изменить форму стрелки
- capstyle : если линия не имеет стрелки, то устанавливает, как завершается линия. Принимает значения: butt (по умолчанию), projecting и round
- joinstyle : управляет соединением сегметов линии. Принимает значения: round (по умолчанию), bevel и miter
- smooth : если значение «true» или «bezier», сглаживает сегменты линии
- splinesteps : управляет сглаживанием изогнутых линий
Параметры отрисовки
Методы отрисовки имеют ряд параметров, которые позволяют настроить стилизацию фигур. Некоторые из этих параметров:
- fill : цвет заполнения фигуры
- width : ширина линий
- outline : для заполненных фигур цвет контура
- dash : устанавливает пунктирную линию
- stipple : устанавливает шаблон для заполнения фигуры (например, gray75, gray50, gray25, gray12)
- activefill : цвет заполнения фигуры при наведении курсора
- activewidth : ширина линий при наведении курсора
- activestipple : шаблон заполнения фигуры при наведении курсора
Применим некоторые параметры:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) canvas.create_line(10, 10, 200, 50, activefill="red", fill="blue", dash=2) canvas.create_line(10, 50, 200, 90, activefill="red", fill="blue", dash=2) root.mainloop()
В данном случае нарисованы две параллельные линии пунктиром синим цветом. При наведении на них указателя мыши, они окрашиваются в красный цвет.

Создание прямоугольника
Для отрисовки прямоугольника применяется метод create_rectangle() , которому обязательно передаются координаты верхнего левого и правого нижнего угла:
create_rectangle(__x0: float, __y0: float, __x1: float, __y1: float)
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) canvas.create_rectangle(10, 20, 200, 60, fill="#80CBC4", outline="#004D40") root.mainloop()

Отрисовка овала
Для отрисовки овала применяется метод create_oval() . В качестве обязательных параметров он принимает координаты прямоугольника, в который будет вписан овал. :
create_oval(__x0: float, __y0: float, __x1: float, __y1: float)
Пример использования метода:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) canvas.create_oval(10, 10, 200, 50, fill="#80CBC4", outline="#004D40") canvas.create_rectangle(10, 10, 200, 50) root.mainloop()
Для наглядности здесь также отрисован прямоугольник, чтобы было видно как вписывается овал:

Отрисовка многоугольника
Для создания многоугольника применяется метод create_polygon() . Он принимает в качестве обязательных параметров набор координатов точек:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) canvas.create_polygon(10, 30, 200, 200, 200, 30, fill="#80CBC4", outline="#004D40") root.mainloop()
В данном случае передаются координаты трех точек, которые в итоге станут вершинами треугольника

Для упрощения также можно передавать набор кортежей, где каждый кортеж представляет отдельную точку:
points = ( (10, 30), (200, 200), (200, 30), ) canvas.create_polygon(*points, fill="#80CBC4", outline="#004D40")
Отрисовка дуги
Для отрисовки дуги применяется метод create_arc() , который принимает набор точек:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) canvas.create_arc((10, 10), (200, 200), fill="#80CBC4", outline="#004D40") root.mainloop()

Отображение текста
Для вывода текста применяется метод create_text() . Ключевыми его параметрами являются координаты точки вывода текста, а также параметр text — сам выводимый текст:
При выводе текста стоит учитывать, что по умолчанию указанные координаты представляют центральную точку вывода текста. Но это поведение можно изменить с помощью опции anchor .
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) canvas.create_text(50, 50, text="Hello METANIT.COM", fill="#004D40") canvas.create_text(50, 100, anchor=NW, text="Hello METANIT.COM", fill="#004D40") root.mainloop()
Здесь два раза выводится один и тот же текст. И в обоих случаях совпадает X-координата. Но во втором случае установлен параметр anchor : его значение «NW» указывает, что координаты будут представлять верхний левый угол прямогольной области, в которой выводится текст

С помощью параметра font можно задать шрифт, в том числе его высоту:
canvas.create_text(10, 10, font="Arial 14", anchor=NW, text="Hello METANIT.COM", fill="#004D40")
Вывод изображения
Для вывода изображения применяется метод create_image() , который в качестве обязательно параметра принимает координаты изображения. Для установки самого изображения в метод через параметр image передается ссылка на изображение:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) python_image = PhotoImage(file="python.png") canvas.create_image(10, 10, anchor=NW, image=python_image) root.mainloop()
В данном случае координаты представлены точкой с x=10 и y=10, а изображение представляет объект PhotoImage (здесь предполагается, что в одной папке с файлом программы находится файл «python.png»). Но как и в случае с выводом текста, следует учитывать, что по умолчанию координаты представляют центр изображения. Чтобы настроить положение изображения относительно координат, применяется параметр anchor . Так, в данном случае значение «NW» означает, что координата представляет верхний левый угол изображения.

Добавление виджетов
Одной из замечательных особенностей Canvas является то, что он позволяет добавлять другие виджеты и таким образом создавать сложные по композиции интерфейсы. Для этого применяется метод create_window() .
create_window(__x: float, __y: float, *, anchor: _Anchor = . height: _ScreenUnits = . state: Literal['normal', 'active', 'disabled'] = . tags: str | list[str] | tuple[str, . ] = . width: _ScreenUnits = . window: Widget = . ) -> _CanvasItemId create_window(__coords: tuple[float, float] | list[int] | list[float], *, anchor: _Anchor = . height: _ScreenUnits = . state: Literal['normal', 'active', 'disabled'] = . tags: str | list[str] | tuple[str, . ] = . width: _ScreenUnits = . window: Widget = . ) -> _CanvasItemId
- _x и _y или __coords : координаты точки размещения виджета. По умолчанию представляет центр виджета
- _anchor : устанавливает положение виджета относительно координат
- height : высота виджета
- width : ширина виджета
- state : состояние виджета
- tags : набор тегов, связанных с виджетом
В качестве результата этот метод возвращает идентификатор добавленного метода.
Например, добавим кнопку:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) btn = ttk.Button(text="Click") canvas.create_window(10, 20, anchor=NW, window=btn, width=100, height=50) root.mainloop()
В данном случае верхний левый угол кнопки будет иметь координаты (x=10, y=20), а сама кнопка имеет ширину 100 и высоту 50 единиц. Если ширина и высота явным образом не указаны, то они имеют значения по умолчанию.

Создание прокрутки
Для создания прокрутки виджет Canvas предоставляет параметр , который позволяет установить прокручиваемую область:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") h = ttk.Scrollbar(orient=HORIZONTAL) v = ttk.Scrollbar(orient=VERTICAL) canvas = Canvas(scrollregion=(0, 0, 1000, 1000), bg="white", yscrollcommand=v.set, xscrollcommand=h.set) h["command"] = canvas.xview v["command"] = canvas.yview canvas.grid(column=0, row=0, sticky=(N,W,E,S)) h.grid(column=0, row=1, sticky=(W,E)) v.grid(column=1, row=0, sticky=(N,S)) root.grid_columnconfigure(0, weight=1) root.grid_rowconfigure(0, weight=1) canvas.create_rectangle(10,10, 300, 300, fill="red") root.mainloop()
В данном случае устанавливается прокручиваемая область 1000х1000:
canvas = Canvas(scrollregion=(0, 0, 1000, 1000), .
Вставить картинку в Label
Пытаюсь вставить в Label картинку, но выдает ошибку Image «. » does not exist , путь точно верный.
from tkinter import * tk = Tk() img = PhotoImage("C:/Users/Public/Pictures/Sample Pictures/Lighthouse.jpg") b = Label(image = img) b.img = "C:/Users/Public/Pictures/Sample Pictures/Lighthouse.jpg" b.pack() tk.mainloop()
Искал, да так и не нашел, в чем проблема. Пробовал писать im = Image.open(path_to_file) и соответственно img = PhotoImage(im) , но выдает ошибку.
Отслеживать
47.8k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 27 мая 2020 в 22:35
Werflame Xij Werflame Xij
81 1 1 золотой знак 3 3 серебряных знака 10 10 бронзовых знаков
Вставка картинки в label
Программа при нажатии кнопки открывает диалог для выбора картинки. Выбранную картинку необходимо вставлять в label. Сейчас выходит ошибка AttributeError: ‘Application’ object has no attribute ‘img’
Знаю, что тема уже обсуждалась. Идея, в общих чертах понятна, но не могу сообразить, как ее применить к своей реализации.
Заранее спасибо
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Вставка функции в label
Учусь работать с tkinter. есть функция таймера: import time import sys def Timer().
Изменение почтового шаблона, вставка графики в письмо (типа логотипа) + вставка картинки в шаблоне
Здравствуйте) Возникло 2 вопроса. 1)Хочется сделать красивый почтовый шаблон с использованием.
Вставка текста в Label
Добрый день, возникла проблема при вставке текста в label. Текст беру из БД, вводила в.

Вставка текста из label в System.IO.File.ReadAllLines();
Здравствуйте в общем такая проблема есть вот такой код string separator = new string < " ".
Регистрация: 11.11.2019
Сообщений: 129
Записей в блоге: 2
Вроде решил проблему
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
from tkinter import * from PIL import ImageTk, Image from tkinter import filedialog class Application(Frame): def __init__(self, master): super(Application, self).__init__(master) self.master = master self.master.config(bg="#D9D9D9") self.create_widgets() def create_widgets(self): image_frame = Frame(self.master) image_frame.grid(row=0, column=0, rowspan=9, columnspan=6, padx=5, pady=5, sticky=NSEW) self.image_file = LabelFrame(image_frame, text=" original image ") self.image_file.grid(ipadx=200, ipady=240, padx=1, pady=1) self.btn = Button(text="open image", width=46, height=2, command=self.open_img) self.btn.grid(row=5, column=6, columnspan=4) def open_file_name(self): filename = filedialog.askopenfilename(title='open') return filename def open_img(self): ofn = self.open_file_name() img = Image.open(ofn) img = img.resize((100, 100), Image.ANTIALIAS) img = ImageTk.PhotoImage(img) lbl = Label(self.image_file, image=img) lbl.image = img lbl.pack()
Добавлено через 29 минут
Вставка картинки изменяет размер LabelFrame. А можно ли сделать так, чтобы не изменяла?
Регистрация: 11.11.2019
Сообщений: 129
Записей в блоге: 2
Решил проблему с изменением размера LabelFrame. Чтобы при вставки не изменялся размер виджета и, как следствие, все остальные элементы не уезжали за границы формы добавил
self.image_file.propagate(False)
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Вывод картинки в Label
Пытаюсь вывести картинку в Label вот так: Image img=getImage(getDocumentBase(),’bla-bla.jpeg’);.

Изменение картинки в Label
Есть объект Label(Метка) в место обычного цвета Background(заднего фона) у меня стоит картинка.
Движение картинки в label
Доброго всем здоровьица! Существует необходимость присвоить label свойства progressbar -a. Надо.
Вставка Картинки
Помогите пожалуйста! Мне надо что бы при выводе на экран, например, Year Black Dog, с этим же.
вставка картинки
Помогите пожалуйста. Нужно вставить картинку в эту область del вот код <HTML> <head> <meta.

Вставка картинки
Добрый вечер товарищи форумчани. Столкнулся с такой проблемой, нужно вставить енота так, чтобы он.
Вставка картинки
Уже третий час сижу в нете и никак не могу найти ответ на вопрос. Есть скрипт: function.
Изображения в Tkinter
Средствами Tkinter можно выводить не только текст, примитивные формы (с помощью виджета Canvas), но и растровые изображения. Следующий пример демонстрирует вывод иконки с растровым изображением (для этого примера нужно предварительно установить пакет Python Imaging Library, PIL):
import Tkinter, Image, ImageTk
FILENAME = «lena.jpg» # файл с графическим изображением
c = Tkinter.Canvas(tk, width=128, height=128)
c.create_image(0, 0, image=img, anchor=»nw»)
В результате получается:

Здесь использован виджет–рисунок (Canvas). С помощью функций из пакетов Image и ImageTk из PIL получается объект–изображение, подходящее для включения в рисунок Tkinter. Свойство anchor задает угол, который привязывается к координатам (0, 0) в рисунке. В данном примере это северо–западный угол (NW — North–West). Другие возможности: n (север), w (запад), s (юг), e (восток), ne, sw, se и с (центр).
В следующем примере показаны графические примитивы, которые можно использовать на рисунке (приведенные комментарии объясняют свойства графических объектов внутри виджета–рисунка):
from Tkinter import *
# Рисунок 300×300 пикселей, фон — белый
c = Canvas(tk, width=300, height=300, bg=»white»)
c.create_arc((5, 5, 50, 50), style=PIESLICE) # Сектор («кусок пирога»)
c.create_arc((55, 5, 100, 50), style=ARC) # Дуга
c.create_arc((105, 5, 150, 50), style=CHORD, # Сегмент
start=0, extent=150, fill=»blue») # от 0 до 150 градусов
# Ломаная со стрелкой на конце
c.create_line([(5, 55), (55, 55), (30, 95)], arrow=LAST)
# Кривая (сглаженная ломаная)
c.create_line([(105, 55), (155, 55), (130, 95)], smooth=1)
# Многоугольник зеленого цвета
c.create_polygon([(205, 55), (255, 55), (230, 95)], fill=»green»)
c.create_oval((5, 105, 50, 120), )
# Прямоугольник красного цвета с большой серой границей
c.create_rectangle((105, 105, 150, 130), fill=»red»,
c.create_text((5, 205), text=» Hello», anchor=»nw»)
# Эта точка визуально обозначает угол привязки
c.create_oval((5, 205, 6, 206), outline=»red»)
# Текст с заданным выравниванием
c.create_text((105, 205), text=»Hello, my friend!»,
c.create_oval((105, 205, 106, 206), outline=»red»)
# Еще один вариант
c.create_text((205, 205), text=»Hello, my friend!»,
c.create_oval((205, 205, 206, 206), outline=»red»)
В результате работы этой программы на экране появится окно:

Следует заметить, что методы create_* создают объекты, свойства которых можно менять в дальнейшем: переместить в другое место, перекрасить, удалить, изменить порядок и т.д. В следующем примере можно нарисовать кружок, меняющий цвет по щелчку мыши:
from Tkinter import *
from random import choice
colors = «Red Orange Yellow Green LightBlue Blue Violet».split()
c = Canvas(tk, bg=»White», width=»4i», height=300, relief=SUNKEN)
c.coords(CURRENT, (event.x–R, event.y–R, event.x+R, event.y+R))
oval = c.create_oval((100–R, 100–R, 100+R, 100+R), fill=»Black»)
Здесь нарисован кружок радиуса R, с ним связана функция change_ball() по нажатию кнопки мыши. В указанной функции заданы новые координаты кружка (его центр расположен в месте щелчка мыши) и затем изменен цвет случайным образом методом itemconfigure(). Тег CURRENT в Tkinter использован для указания объекта, который принял событие.
