Но погодите, это еще не конец! В приложениях А, Б и В вы можете познакомиться с использованием Python в искусстве, бизнесе и науке. Вы найдете как минимум одну область для исследований.
В Сети можно отыскать множество блестящих объектов. Только вы сможете сказать, какие из них являются бижутерией, а какие — серебряными пулями. И даже если вас в данный момент не преследуют оборотни, серебряные пули могут пригодиться. На всякий случай.
Наконец, вы узнаете ответы на все эти раздражающие упражнения в конце каждой главы, детали установки Python и его друзей, а также получите несколько вспомогательных таблиц для вещей, которые мне всегда нужно подглядывать. Ваш мозг, скорее всего, лучше подготовлен, но так они всегда будут под рукой.
Приложение A. Пи-Арт
Ну, искусство есть искусство, не так ли? С другой стороны, вода есть вода! Восток есть восток, а запад есть запад, и если взять клюкву и растолочь ее до консистенции яблочного соуса, то по вкусу она будет напоминать сливы, не то что толченый ревень.
Возможно, вы художник или музыкант. Или, может быть, просто хотите попробовать что-то креативное, выходящее за рамки привычной деятельности.
В первых трех приложениях рассказывается о наиболее распространенных областях деятельности человека с использованием Python. Если вас интересует одна из этих областей, вы можете почерпнуть из этих глав несколько идей или они подтолкнут вас попробовать что-то новое.
2D-графика
Все языки программирования в какой-то степени работают с компьютерной графикой. Многие мощные платформы в этом приложении для быстродействия были написаны на С или С++, но для продуктивности добавлены библиотеки Python. Начнем с рассмотрения некоторых библиотек для работы с двухмерными изображениями.
Стандартная библиотека
В стандартной библиотеке содержатся всего несколько модулей, связанных с графикой. Рассмотрим два из них:
• Imghdr. Этот модуль определяет тип некоторых файлов изображений;
• Colorsys. Этот модуль преобразует цвета между разными системами: RGB, YIQ, HSV и HLS.
Если вы загрузили логотип издательства O’Reilly и сохранили его под именем oreilly.png, можете запустить этот код:
>>> import imghdr
>>> imghdr.what('oreilly.png')
'png'
Чтобы сделать с графикой в Python что-то серьезное, нужно загрузить сторонние пакеты. Давайте их рассмотрим.
PIL и Pillow
Многие годы Python Image Library (PIL, библиотека изображений Python) (http://bit.ly/py-image), несмотря на то что ее нет в стандартной библиотеке, является самой известной библиотекой для обработки двухмерных изображений. Она предшествовала установщикам вроде pip, поэтому был создан «дружественный форк» с названием Pillow (http://pillow.readthedocs.org/). Код для работы с изображениями Pillow совместим с кодом PIL, а его документация хороша, поэтому используем его здесь.
Установить его просто — достаточно ввести следующую команду:
$ pip install Pillow
Если вы уже устанавливали пакеты libjpeg, libfreetype и zlib, они будут обнаружены и использованы Pillow. На странице с инструкциями по установке (http://bit.ly/pillow-install) вы узнаете больше.
Откроем файл изображения:
>>> from PIL import Image
>>> img = Image.open('oreilly.png')
>>> img.format
'PNG'
>>> img.size
(154, 141)
>>> img.mode
'RGB'
Несмотря на то что пакет называется Pillow, вы импортируете его как PIL, чтобы код был совместим со старым PIL.
Для того чтобы отобразить изображение на экране с помощью метода show() объекта Image, вы сначала должны установить пакет ImageMagick, описанный в следующем разделе, а затем попробовать вот что:
>>> img.show()
Изображение, показанное на рис. A.1, открывается в другом окне. (Этот снимок экрана был сделан на компьютере Mac, где функция show() используется для приложения предварительного просмотра изображений. Отображение ваших окон может быть иным.)
Рис. A.1. Изображение, открытое с помощью библиотеки Python
Обрежем изображение в памяти, сохраним результат как новый объект с именем img2 и отобразим его.
Изображения всегда измеряются в горизонтальных (х) и вертикальных (у) значениях, один из углов изображения называется стартовой точкой, его значения х и у равны 0. В этой библиотеке origin(0, 0) находится в левом верхнем углу изображения, х увеличивается при смещении вправо, а у увеличивается при смещении вниз. Мы хотим задать значения левого края х (55), верхнего края у (70), правого края х (85) и нижнего края у (100) для метода crop(), поэтому передаем кортеж, содержащий эти значения в соответствующем порядке:
>>> crop = (55, 70, 85, 100)
>>> img2 = img.crop(crop)
>>> img2.show()
Результат показан на рис. А.2.
Сохраним изображение с помощью метода save(). Он принимает имя файла и опциональный путь. Если имя файла имеет суффикс, библиотека использует его, чтобы определить тип. Но вы также можете указать тип файла явно. Для того чтобы сохранить изображение с расширением GIF, сделайте следующее:
>>> img2.save('cropped.gif', 'GIF')
>>> img3 = Image.open('cropped.gif')
>>> img3.format
'GIF'
>>> img3.size
(30, 30)
Рис. A.2. Обрезанное изображение
«Улучшим» наш маленький талисман. Сначала загрузим изображение усов (http://bit.ly/moustaches-png) и сохраним его в файл moustaches.png. Мы загрузим его, обрежем соответствующим образом, а затем наложим на нашу зверушку:
>>> mustache = Image.open('moustaches.png')
>>> handlebar = mustache.crop((316, 282, 394, 310))
>>> handlebar.size
(78, 28)
>>> img.paste(handlebar, (45, 90))
>>> img.show()
На рис. А.3 показан подходящий результат.
Рис. A.3. Наш новый опрятный талисман
Было бы здорово, если бы фон у картинки с усами был прозрачным. О, вот и упражнение для вас! Если вы хотите этим заняться, поищите информацию о прозрачности (transparency) и альфа-канале (alpha channel) в руководстве в Pillow (http://bit.ly/pil-fork).
ImageMagick
ImageMagick (http://www.imagemagick.org/) — это комплект программ для конвертирования, изменения и отображения двухмерных изображений. Он существует более 20 лет. Различные библиотеки Python подключены к библиотеке ImageMagick, написанной на С. Самая недавняя из них, поддерживающая Python 3, называется wand (http://docs.wand-py.org/). Для того чтобы установить ее, введите следующую команду:
$ pip install Wand
С помощью wand вы можете делать примерно то же, что и с помощью Pillow:
>>> from wand.image import Image
>>> from wand.display import display
>>>
>>> img = Image(filename='oreilly.png')
>>> img.size
(154, 141)
>>> img.format
'PNG'
Как и в случае с Pillow, эта строка отобразит изображение на экране:
>>> display(img)
wand позволяет вам поворачивать изображение, изменять его размер, писать текст, рисовать линии и многое другое, что вы можете найти и в Pillow. Оба этих пакета имеют хорошие API и документацию.
Графические пользовательские интерфейсы (Graphical User Interface, GUI)
Название содержит слово «графический», но GUI концентрируется скорее на пользовательском интерфейсе: виджетах для представления данных, методах ввода, меню, кнопках и окнах.
Страница «Википедии» GUI programming (http://bit.ly/gui-program) и список часто задаваемых вопросов (http://bit.ly/gui-faq) содержат множество примеров GUI, созданных с помощью Python. Начнем с единственного встроенного в стандартную библиотеку примера — Tkinter (https://wiki.python.org/moin/TkInter). Он прост, но работает на всех платформах и создает естественно выглядящие окна и виджеты.
Рассмотрим небольшую программу, где используется Tkinter, она отображает наш любимый талисман в отдельном окне:
>>> import tkinter
>>> from PIL import Image, ImageTk
>>>
>>> main = tkinter.Tk()
>>> img = Image.open('oreilly.png')
>