В предыдущих примерах работы с изображениями мы прикрепляли виджеты к кнопкам и холстам, однако стандартный набор инструментов библиотеки tkinter позволяет прикреплять изображения к виджетам различных типов, включая простые метки, текстовые виджеты и элементы меню. Так, сценарий в примере 8.42 отображает изображение в метке, находящейся в главном окне приложения, используя только средства библиотеки tkinter. Этот сценарий предполагает, что изображения хранятся в подкаталоге images, а также позволяет передавать имя файла с изображением в аргументе командной строки (при отсутствии аргументов по умолчанию используется файл spam.gif). Кроме того, для большей переносимости он объединяет имена файлов и каталогов с помощью os.path.join и выводит высоту и ширину изображения в пикселях в стандартный поток вывода, исключительно чтобы предоставить дополнительную информацию.
Пример 8.42. PP4E\Gui\PIL\viewer-tk.py
отображает изображение с помощью стандартного объекта PhotoImage из библиотеки tkinter; данная реализация может работать с GIF-файлами, но не может обрабатывать изображения в формате JPEG; использует файл с изображением, имя которого указано в командной строке, или файл по умолчанию; используйте Canvas вместо Label, чтобы обеспечить возможность прокрутки, и т.д.
import os, sys
from tkinter import * # использовать стандартный объект PhotoImage
# работает с форматом GIF, а для работы с форматом JPEG # требуется пакет PIL
imgdir = ‘images’
imgfile = ‘london-2010.gif’
if len(sys.argv) > 1: # аргумент командной строки задан?
imgfile = sys.argv[1]
imgpath = os.path.join(imgdir, imgfile)
win = Tk()
win.title(imgfile)
imgobj = PhotoImage(file=imgpath)
Label(win, image=imgobj).pack() # прикрепить к метке Label
print(imgobj.width(), imgobj.height()) # вывести размеры в пикселях, win.mainloop() # пока объект не уничтожен
На рис. 8.43 изображено окно этого сценария в Windows 7, где отображается изображение из GIF-файла по умолчанию. Запустите его из консоли, передав имя файла в виде аргумента командной строки, чтобы просмотреть другое изображение из подкаталога images (например, python viewer_tk.py filename.gif).
Рис. 8.43. Отображение картинки в формате GIF средствами tkinter
Сценарий в примере 8.42 может работать только с изображениями, форматы которых поддерживаются базовым набором инструментов в библиотеке tkinter. Для отображения изображений в других форматах, таких как JPEG, необходимо установить пакет PIL и использовать его альтернативную реализацию класса PhotoImage. С точки зрения программного кода, для этого достаточно добавить всего одну инструкцию import, как показано в примере 8.43
Пример 8.43. PP4E\Gui\PIL\viewer-pil.py
отображает изображение с помощью альтернативного объекта из пакета PIL поддерживает множество форматов изображений; предварительно установите пакет PIL: поместите его в каталог Lib\site—packages
import os, sys
from tkinter import *
from PIL.ImageTk import PhotoImage # <== использовать альтернативный класс из
# PIL, остальной программный код
# без изменений
imgdir = ‘images’
imgfile = ‘florida-2009-1.jpg’ # поддерживает gif, jpg, png, tiff, и др.
if len(sys.argv) > 1:
imgfile = sys.argv[1]
imgpath = os.path.join(imgdir, imgfile)
win = Tk()
win.title(imgfile)
imgobj = PhotoImage(file=imgpath) # теперь поддерживает и JPEG!
Label(win, image=imgobj).pack()
win.mainloop()
print(imgobj.width(), imgobj.height()) # показать размер в пикселях при выходе
Задействовав пакет PIL, наш сценарий теперь способен отображать изображения в самых разных форматах, включая формат JPEG картинки по умолчанию, изображенной на рис. 8.44. Поэкспериментируйте со сценарием самостоятельно и попробуйте отобразить другие картинки.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011