Вставить картинку в 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) , но выдает ошибку.
Отслеживать
49k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 27 мая 2020 в 22:35
Werflame Xij Werflame Xij
81 1 1 золотой знак 3 3 серебряных знака 10 10 бронзовых знаков
Используем Python Pillow для вставки текста и изображения в картинку

Pillow это одна из самых популярных библиотек Python для работы с изображениями. Ранее эта библиотека называлась PIL и последний ее релиз был в 2009, после чего разработчики продолжили ее развитие под названием Pillow. В этой статье будет рассмотрен пример вставки текста и изображения в новую или существующую картинку.
Pillow устанавливается отдельно:
pip install Pillow
Навигация по посту
- Создание и открытие изображения
- Добавление текста к изображению
- Вставка изображения
- Определение высоты и ширины
Создание и открытие изображения
Для открытия и создания изображения используется модуль Image. На следующем примере мы откроем существующее изображение:
from PIL import Image im = Image.open('d:/beach.jpeg') # Откроет изображение в новом окне im.show()

В следующем примере мы создадим изображение, где мы должны указать:
- Цветовую модель. Например RGB,RGBA,CMYK,HCL и т.д.;
- Размер изображения в кортеже;
- По умолчанию изображение создается с черным фоном. Для его изменения нужно заполнить атрибут color.
from PIL import Image im = Image.new('RGB', (200,200), color=('#FAACAC')) # Откроет изображение в новом окне im.show()

Сохранить изображение можно через save:
from PIL import Image im = Image.new('RGB', (200,200), color=('#FAACAC')) im.save('D:/new_pic.jpg')
Вам так же будет интересно:
Модуль Python os — примеры создания и работы с папками и путями
Добавление текста к изображению
Для изменения изображение используется класс ImageDraw. В следующем примере мы создадим объект этого класса с текстом, где нужно указать:
- Расположение текста. В примере ниже это (100, 100);
- Сам текст;
- Цвет текста.
from PIL import Image, ImageDraw im = Image.new('RGB', (200,200), color=('#FAACAC')) draw_text = ImageDraw.Draw(im) draw_text.text( (100,100), 'Test Text', fill=('#1C0606') ) im.show()

Если использовать кириллические символы, может появится ошибка:
- AttributeError: ‘ImageFont’ object has no attribute ‘getmask2’
- UnicodeEncodeError: ‘latin-1’ codec can’t encode characters
Для исправления ошибки вы можете использовать свой шрифт через класс ImageFont. Вы так же сможете указать размер шрифта:
from PIL import Image, ImageDraw, ImageFont im = Image.new('RGB', (200,200), color=('#FAACAC')) # Создаем объект со шрифтом font = ImageFont.truetype('D:/Roboto/Roboto-Black.ttf', size=18) draw_text = ImageDraw.Draw(im) draw_text.text( (100, 100), 'Текст 18px', # Добавляем шрифт к изображению font=font, fill='#1C0606') im.show()

Вставка изображения
Для создания водяного знака, например, откройте второе изображение и используйте функцию paste. При этом первый параметр с watermark будет использовать всю область изображения, а второй установит прозрачность (альфа-канал):
from PIL import Image im = Image.open('d:/beach.jpeg') # Изображение для водяного знака watermark = Image.open('d:/logo.png') im.paste(watermark, (25,25), watermark) im.show()
Определение высоты и ширины
Если вы планируете открывать множество изображений, разных размеров и добавлять текст, например в правый нижний угол вы можете вычислить это местоположение. Объекты Image содержат размеры:
# Ширина и высота im.size # Ширина im.width # Высота im.height

Если вы используете водяные знаки, то можно просто вычесть из основного изображения размеры водяного знака и получить корректное расположение в правом угле:
from PIL import Image im = Image.open('d:/beach.jpeg') watermark = Image.open('d:/logo.png') # Вычисляем расположение watermark position = (im.width - watermark.width, im.height - watermark.height) im.paste(watermark, position, watermark) im.show()
Работа с изображениями
Для того чтобы использовать картинки в вашей программе вам надо сделать следующее:
- Загрузить/найти нужный файл в формате png
- Положить его в ту же папку где находится файл с кодом вашей программы ( .py )
- В программе написать следующую строчку
image = pygame.image.load('file.png').convert_alpha()
image будет переменной с нашим изображением.
Как и любую переменную, картинку нужно загружать перед игровым циклом ( while running: ). Если вы используете несколько картинок, даже для одного предмета (например разные направления) загружайте их все один раз в начале программы и используйте в зависимости от ситуации.
Вывод на экран
screen.blit(image, (x, y))
Изображение нарисуется левым верхним углом в точке (x, y) .
Изменение размера
Часто оказывается что картинка которую мы загрузили имеет большое разрешение, а значит и размер на экране. Вместо того чтобы исправлять это вручную в графическом редакторе используйте
new_image = pygame.transform.scale(image, (width, height))
new_image будет вашей картинкой измененной до размеров width и height .
Поворот
new_image = pygame.transform.rotate(image, angle)
повернет изображение image на angle градусов.
Внимание
Нельзя поворачивать уже повернутую картинку. Это связанно с тем что повернутое изображение занимает больший прямоуглоьник чем старое, а значит его поворот будет искажаться. Нельзя вместо
image = pygame.transform.rotate(image, 5)
image = pygame.transform.rotate(image, 1) image = pygame.transform.rotate(image, 1) image = pygame.transform.rotate(image, 1) image = pygame.transform.rotate(image, 1) image = pygame.transform.rotate(image, 1)
Аналогично, если вы хотите чтобы картинка поворачивалась на 1 градус каждый кадр, нельзя писать
while running: . image = pygame.transform.rotate(image, 1)
Вместо этого нужно исходную картинку всегда хранить без изменений, а повернутую получать каждый кадр заново.
angle = 0 while running: . angle = angle + 1 rotated_image = pygame.transform.rotate(image, angle)
Python. Работа с изображениями в tkinter.
На уроке Python. Работа с изображениями мы с вами научились загружать и отображать картинки, а также всяко извращаться с ними. Это мы делали при помощи библиотеки PIL. На уроке Python. GUI мы с вами при помощи библиотеки tkinter создавали виндовый интерфейс программы: всякие кнопочки, флажки, и прочие элементы управления. Но возникает вопрос: а нельзя ли при помощи tkinter как-то выводить изображение на виндовую форму? Можно. Например вот такая программа:
import tkinter from PIL import Image, ImageTk root = tkinter.Tk() # создаем рабочую область frame = tkinter.Frame(root) frame.grid() #Добавим метку label = tkinter.Label(frame, text="Hello, World!").grid(row=1,column=1) # вставляем кнопку but = tkinter.Button(frame, text="Кнопка").grid(row=1, column=2) #Добавим изображение canvas = tkinter.Canvas(root, height=400, width=700) image = Image.open("d:/3/Dscn0116.jpg") photo = ImageTk.PhotoImage(image) image = canvas.create_image(0, 0, anchor='nw',image=photo) canvas.grid(row=2,column=1) root.mainloop()
выдаст вот такое окно:

Что интересно, PIL здесь нужен, чтобы загружать изображения типа jpg, gif-ы и png можно открыть и без него:
import tkinter root = tkinter.Tk() # создаем рабочую область frame = tkinter.Frame(root) frame.grid() #Добавим метку label = tkinter.Label(frame, text="Hello, World!").grid(row=1,column=1) # вставляем кнопку but = tkinter.Button(frame, text="Кнопка").grid(row=1, column=2) #Добавим изображение canvas = tkinter.Canvas(root, height=400, width=700) img = tkinter.PhotoImage(file = 'd:/3/Dscn0116.png') image = canvas.create_image(0, 0, anchor='nw',image=img) canvas.grid(row=2,column=1) root.mainloop()
А теперь попробуем при нажатии на кнопку сменить изображение:
import tkinter from PIL import Image, ImageTk root = tkinter.Tk() # создаем рабочую область frame = tkinter.Frame(root) frame.grid() # Добавим метку label = tkinter.Label(frame, text="Hello, World!").grid(row=1, column=1) image = Image.open("d://1//DSCN1128.png") photo = ImageTk.PhotoImage(image) def my_event_handler(): print("my_event_handler") image = Image.open("d://1//original.jpg") photo = ImageTk.PhotoImage(image) image = canvas.create_image(0, 0, anchor='nw', image=photo) canvas.grid(row=2, column=1) # вставляем кнопку but = tkinter.Button(frame, text="Кнопка", command=my_event_handler).grid(row=1, column=2) # Добавим изображение canvas = tkinter.Canvas(root, height=400, width=700) image = canvas.create_image(0, 0, anchor='nw', image=photo) canvas.grid(row=2, column=1) root.mainloop()
Но не тут то было. При нажатии на кнопку изображение не меняется. Хотя, казалось бы, все написано правильно, и наш обработчик событий работает, наше сообщение, что мы выводим командой print выводится в окно сообщений. В чем же дело? А дело в сборщике мусора (garbage collector). Как только мы вышли из my_event_handler, локальные переменные тут же уничтожаются сборщиком мусора. Именно поэтому мы видим на форме ту же самую картинку, что и до нажатия на кнопку. Как же быть? Не использовать локальные переменные. Давайте объявим класс, пусть изображение и прочие объекты хранятся в его полях:
import tkinter from PIL import Image, ImageTk class App: def __init__(self): self.root = tkinter.Tk() # создаем рабочую область self.frame = tkinter.Frame(self.root) self.frame.grid() # Добавим метку self.label = tkinter.Label(self.frame, text="Hello, World!").grid(row=1, column=1) self.image = Image.open("d://1//DSCN1128.png") self.photo = ImageTk.PhotoImage(self.image) # вставляем кнопку self.but = tkinter.Button(self.frame, text="Кнопка", command=self.my_event_handler).grid(row=1, column=2) # Добавим изображение self.canvas = tkinter.Canvas(self.root, height=600, width=700) self.c_image = self.canvas.create_image(0, 0, anchor='nw', image=self.photo) self.canvas.grid(row=2, column=1) self.root.mainloop() def my_event_handler(self): print("my_event_handler") self.image = Image.open("d://1//original.jpg") self.photo = ImageTk.PhotoImage(self.image) self.c_image = self.canvas.create_image(0, 0, anchor='nw', image=self.photo) self.canvas.grid(row=2, column=1) app= App()
