python — Как вставить картинку в Tkinter через Pillow (PIL)
Вопрос задан
Изменён 4 месяца назад
Просмотрен 74 раза
Как вставить картинку в Tkinter?
- python
- python-3.x
- tkinter
- изображения
- pillow
Прежде чем мы напишем код мы должны установить PIL (Pillow)
$ pip install Pillow
В коде есть все подробности — смотрим и разбираемся.
from tkinter import Tk, Canvas, Frame, BOTH, NW # Импортируем Tkinter модули from PIL import Image, ImageTk # Импортируем Pillow class Images(Frame): def __init__(self): super().__init__() self.initUI() # Делаем оболочку def initUI(self): self.master.title("Заголовок окна") # Заголовок окна self.pack(fill=BOTH, expand=1) self.img = Image.open("tatras.png") # В кавычках вписать название файла или полный путь self.tatras = ImageTk.PhotoImage(self.img) # Вставляем изображение canvas = Canvas( # Делаем доску для вставления изображения и прописываем необходимые атрибуты self, width=self.img.size[0] + 20, height=self.img.size[1] + 20 ) canvas.create_image(10, 10, anchor=NW, image=self.tatras) # Создание изображения на холсте (доске) canvas.pack(fill=BOTH, expand=1) # Тип Canvas (т.е. как она будет вставлена, размер и т.д.) def main(): root = Tk() ex = Images() root.mainloop() if __name__ == '__main__': main()
2
Зарегистрируйтесь или войдите
Регистрация через GoogleРегистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Python.

На уроке 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()
Теперь все работает.
Как вставить изображение в ответ обсуждения как…
Вы можете встроить файл изображения непосредственно в ответы обсуждения, используя значок изображения. Изображения могут быть встроены из Интернета, ваших пользовательских файлов Canvas или Flickr. Если в источник вашего изображения внесены изменения после того, как вы встроили его в ответ на обсуждение, изображение, добавленное в ваш ответ на обсуждение, не будет изменено.
Примечания:
- Прежде чем вы сможете встроить изображение из Canvas, оно должно быть загружено в ваши пользовательские файлы.
- Вы также можете прикрепить файл к ответу на обсуждение.
- Если вы опубликуете свой ответ на обсуждение до завершения загрузки вложенного изображения, Canvas отобразит предупреждающее сообщение.
Добавить изображение с панели инструментов
Чтобы добавить изображение с панели инструментов, щелкните значок Изображение [1].
Вы также можете загрузить изображение из меню параметров изображения. Чтобы просмотреть дополнительные параметры изображения, щелкните стрелку Параметры изображения [2]. Затем выберите Загрузить изображение опция [3].
Примечание: Для просмотра значка изображения может потребоваться щелкнуть значок Параметры [4].
Загрузка изображения с компьютера
По умолчанию инструмент загрузки изображений отображает вкладку Компьютер [1]. Щелкните или перетащите файл изображения в загрузчик изображений, чтобы загрузить файл с вашего компьютера [2].
Примечание: Изображения, загруженные с вашего компьютера с помощью инструмента загрузки изображений, добавляются в ваши пользовательские файлы.
Выберите файл
Выберите файл изображения [1] и нажмите кнопку Открыть [2].
Просмотр выбранного файла
Программа загрузки отображает имя файла изображения [1] и предварительный просмотр изображения [2]. Чтобы удалить изображение, щелкните значок
Удалить [3].Вставить изображение из Unsplash
Чтобы встроить изображение из Unsplash, щелкните вкладку Unsplash [1].
Введите поисковый запрос в поле Search Term [2] и выберите один из отображаемых вариантов [3]. Чтобы просмотреть дополнительные параметры изображения, щелкните ссылки навигации по страницам [4].
Примечание: Canvas использует фильтры безопасного поиска, предоставляемые Unsplash. Вы можете узнать больше о политике контента Unsplash на их странице условий.
Встроить изображение с URL-адреса
Чтобы встроить изображение с помощью URL-адреса, щелкните вкладку URL-адрес [1].
Введите URL-адрес в поле URL-адрес файла [2].
Управление правами на использование
Если этого требует ваше учреждение, вам потребуется выбрать настройки прав на использование для вашего изображения.
В раскрывающемся меню Право использования [1] выберите один из пяти вариантов права использования:
- Мне принадлежат авторские права: оригинальный контент, созданный вами
- Я получил разрешение на использование файла: авторизованное разрешение автора
- Материал находится в общественном достоянии: явно отнесен к общественному достоянию, не может быть защищен авторским правом или больше не защищен авторским правом
- Материал подлежит исключению — напр.
добросовестное использование, право на цитирование или другие положения применимых законов об авторском праве: отрывок или резюме, используемые для комментариев, новостей, исследований или анализа в образовании
- Материал находится под лицензией Creative Commons: для этой опции также требуется установка специальной лицензии Creative Commons
Если известно, введите информацию о владельце авторских прав в поле Владелец авторских прав [2].
Примечание: Если вы являетесь инструктором и не уверены, какие права на использование применяются к вашему изображению, обратитесь за инструкциями к администратору учреждения.
Управление атрибутами изображения
Чтобы добавить замещающий текст к изображению, введите альтернативное текстовое описание или текстовые теги в поле Замещающий текст [1]. По умолчанию в поле «Замещающий текст» отображается имя файла изображения. Замещающий текст читается программами чтения с экрана и отображается, когда встроенное изображение не может быть отображено.
Если изображение является декоративным и не требует замещающего текста, выберите параметр Декоративное изображение [2].
По умолчанию для встроенных изображений выбран вариант отображения Embed Image [3].
Чтобы отобразить ссылку на файл изображения, выберите параметр отображения Display Text Link [4]. Ссылка на файл заменит изображение в редакторе Rich Content Editor.
Встроить изображение
Чтобы встроить выбранное изображение, нажмите кнопку Отправить .
Примечание: Изображение будет мигать перед его внедрением в Rich Content Editor.
Просмотр встроенного изображения
Просмотр загруженного изображения в редакторе расширенного содержимого. Вы также можете добавлять или изменять теги замещающего текста и управлять параметрами отображения изображения.
Опубликовать ответ
Нажмите кнопку Опубликовать ответ .
Просмотреть ответ в обсуждении
Просмотреть ответ в обсуждении.
Использование изображений — How to Canvas
Автор: Шон Нуфер
В этом уроке мы обсудим, как загружать и вставлять изображения в Canvas, где найти изображения отличного качества, в чем разница между различными форматами изображений и какие из них лучше (спойлер: это зависит от того, и, наконец, несколько основных советов по стилю изображения для улучшения потока вашей страницы Canvas. Не стесняйтесь следовать курсу Canvas во время просмотра учебника.
Загрузка и встраивание
Загрузка
Существует два подхода к размещению изображения на странице Canvas. Один из них — загрузить изображение с вашего устройства в Canvas. Это, пожалуй, самый распространенный подход, который заключается в щелчке значка «Загрузить изображение» в редакторе расширенного содержимого или в меню: «Вставить» >> «Изображение» >> «Загрузить изображение». Затем вы либо перетащите изображение со своего компьютера, либо щелкните интерфейс для поиска вашего изображения.
Когда вы загружаете изображение, вы должны помнить о его размере. Если у вас есть изображение с высоким разрешением, размером с постер фильма, но вы планируете использовать его только в качестве 300-пиксельного изображения, вы можете рассмотреть возможность изменения его размера перед загрузкой в Canvas. Таким образом, учащимся с плохим подключением к Интернету не придется слишком долго ждать загрузки изображения. Изображение размером 8 МБ, но отображаемое на экране относительно небольшим, все равно должно загружать весь размер файла. Подробнее о сжатии и размере файла изображения читайте ниже о разнице между форматами изображений PNG и JPG.
Встраивание
Очень практичным подходом к использованию изображений в Canvas является встраивание их в ваш курс. Изображения, которые находятся в Интернете, могут быть встроены напрямую, то есть вам не нужно сначала загружать их, а затем загружать. Изображение не живет в Canvas, но отображается в Canvas. Недостатком является то, что если изображение будет удалено из того места, откуда оно было встроено, оно больше не будет отображаться в вашем курсе. Двумя основными способами встраивания изображения являются поиск в репозитории Unsplash в Canvas или встраивание изображения с использованием прямого URL-адреса.
Помимо Unsplash.com, есть и другие хорошие веб-сайты, на которых можно найти бесплатные изображения в высоком разрешении и хорошего качества: Microsoft Office 365.
Форматирование изображений в Canvas
Существует несколько простых приемов CSS, которые можно выполнить в редакторе HTML, чтобы выровнять изображение и задать поля. Это может помочь придать вашему курсу более цельный вид при организации компонентов. Это также помогает придать ему более профессиональный вид. Две хитрости, которые вы захотите изучить, — это перемещать изображение влево или вправо и обеспечивать поля.
Чтобы добавить CSS, вам нужно отредактировать страницу в редакторе HTML. Найдите свое изображение и добавьте следующий код в тег
:
style=»float: left;»
или
style=»float: right;»
Затем вы можете добавить поля вокруг изображения в стиле. Если вы хотите, чтобы ваше изображение плавало в правой части страницы, и вы хотите, чтобы вокруг него было 20 пикселей поля, тогда вы должны использовать этот код:
style=»float: right; margin: 20px;»
Если вы хотите, чтобы он плавал в левой части страницы, и вам нужны поля только справа и снизу, но не слева или сверху, вы должны написать:
style=»float: left; margin- справа: 20 пикселей; нижняя граница: 10 пикселей;»
Вот два примера изображений, плавающих влево. У одного есть поле для отделения изображения от текста, а у другого нет поля.
style=»float: слева; отступ справа: 20 пикселей; отступ снизу: 10 пикселей;»
стиль = «поплавок: слева; »
Типы файлов изображений: JPG, PNG, GIF
tl;dr
JPG — формат с потерями, тогда как PNG и GIF — форматы без потерь else
PNG и GIF поддерживают прозрачность, а JPG — нет
JPG — хороший вариант для файлов небольшого размера
PNG — хороший вариант для высокого качества.
В то время сжатие файлов было очень важно, так как скорость Интернета и скорость передачи файлов были очень медленными и не всегда стабильными. Нам нужен был надежный способ обмена изображениями, и хорошим способом для этого было сжатие больших файлов изображений до файлов небольшого размера. Компромисс заключался в том, что при сжатии файлов изображения сильно теряют в качестве. Таким образом, JPG относится к формату файлов со сжатием с потерями. В то время JPG был фантастической альтернативой BMP. JPG по-прежнему является стандартным форматом для фотографий и реалистичных изображений, особенно если вы хотите избежать отправки больших файлов, например, по электронной почте или с телефона.
Забавный факт: для тех, кто помнит более старые операционные системы, такие как MS-DOS, расширения файлов не могли превышать трех символов, поэтому JPEG стал JPG. Сегодня вы можете увидеть ссылки на оба расширения файлов, но они абсолютно одинаковы. JPG остается более популярным расширением.
PNG
В отличие от JPG, изображение PNG является форматом без потерь, что означает, что любое сжатие не влияет на качество изображения. Недостатком является то, что размеры файлов PNG, как правило, намного больше, чем JPG. С оптимизацией полосы пропускания и возможностью обработки больших объемов данных компьютерами и мобильными веб-устройствами PNG стал стандартным типом файлов для веб-изображений, поскольку он идеально подходит для графики, текста и других видов искусства.
Одним из примечательных аспектов файлов PNG является возможность поддержки прозрачности. В то время как JPG заполняет любые прозрачные части изображения белым цветом, PNG оставляет эти области пустыми. Это удобно при работе с фотографиями в таких программах, как Photoshop или Gimp, где вам не нужен «белый прямоугольник», окружающий края объекта, формы или изображения.
GIF
Угачака
Бэби
GIF — это формат файла, который возник в ту же эпоху, что и JPG, но сжимается без потерь, как PNG.
Подобно PNG, формат GIF поддерживает прозрачность. Что традиционно отличало GIF от других форматов, так это возможность поддерживать анимацию. Пожалуй, самый заметный анимированный GIF-файл — это танцующий ребенок или «Ugachaka Baby» конца 90-х.
Использование анимированных GIF-файлов в образовании может быть полезным для демонстрации простых процессов или инструкций. В качестве декоративного элемента анимированные изображения (например, танцующий ребенок) могут сильно отвлекать и отвлекать внимание от более важного контента. Будьте осторожны с анимацией в презентациях, даже если анимация кажется актуальной для темы.
Сводка
JPG
— это формат Lossy (не высокое разрешение)
обычно используется для фотографий
.
PNG
— формат без потерь (высокое разрешение).0003
поддерживает прозрачность
— наиболее распространенный стандарт для онлайн-изображений
GIF
Пожалуйста, рассмотрите возможность подписки на наш канал YouTube, чтобы получать дополнительные советы и рекомендации по работе с Canvas.