Добавляем картинки и пишем тамагочи
На самом деле все просто, достаточно просто добавить Label и задать для него фоновое изображение. Картинку можно утащить отсюда. Вот так.
from tkinter import * window = Tk() # открываем картинку luntik.gif, она лежит в одной папке с программой и кладем в переменную luntik_image luntik_image = PhotoImage(file='luntik.gif') # создаем текстовое поле и указываем, что туда нужно поместить картинку из переменной luntik_image Label(window, image=luntik_image).pack() mainloop()
Но есть один нюанс: tkinter не умеет работать с большинством популярных форматов графики, из коробки доступен только gif. Однако эта проблема легко решается установкой стороннего модуля Pillow !
Установка сторонних модулей
Если нам не хватает операций языка Python, а также встроенных модулей (библиотек), наступает тот самый момент, когда пора воспользоваться сторонними модулями.
Для установки модулей необходимо использовать программу pip, которая устанавливается на ваш компьютер вместе в питоном. Единственный нюанс, pip работает только через командную строку. Для ее вызова необходимо нажать Win+R , а затем в окне «Выполнить» ввести cmd и нажать Enter.
Для Mac вызов командной строки устроен аналогично, только вместо Win+R нужно использоватьл комбинацию Command + пробел , а затем в поле Spotlight ввести terminal.

Чтобы вызвать установщик пакетов, достаточно написать в консоли pip (или pip3 , если не работает команда pip ) и нажать Enter . Вы увидите что то похоже на.

Если команда pip не найдена, скорее всего при установке python вы не активировали галочку «Add to PATH».
Есть два варианта решения проблемы: переустановить python или добавить путь к питону в PATH вручную.
Добавляя к команде pip различные параметры, мы можем выполнять различные операции. Для начала давайте попробуем вывести список модулей, установленных на вашем компьютере. Для этого в командной строке необходимо ввести pip list , а затем нажать клавишу Enter (клавиша Enter нажимается для любой операции в командной строке).
В ответ мы получим длинный список из двух колонок, как на картинке выше. Слева пишется имя модуля, а справа текущая версия этого модуля. Если хотим посмотреть, установлен ли у нас какой-то конкретный модуль, то нужно ввести pip show . Для примера посмотрим, есть ли у меня модуль pillow , который мы будем будем использовать для работы с графикой.

Как видишь, уже есть. Более того, в информации указана версия, автор и прочая информация. Если же модуль не установлен или при вводе названия допущена ошибка, то информация не будет выведена.
Наличие больших и маленьких букв в названии модуля роли не играет. Даже если ввести pip show PiLloW , pip все равно вывел бы информацию о нем. Если какой-то модуль нам больше не нужен или возникла какая-то неполадка в его работе, то мы можем его удалить, введя pip uninstall .
Ничего сложного! А если я хочу обратно его установить, то мне нужно ввести pip install .
Вот и все. После установки, можно спокойно импортировать модули так же, как это было показано в предыдущих параграфах.
Мы перечислили некоторые самые важные возможности pip , хотя это далеко не полный их перечень. Для более подробного знакомства обратитесь к документации pip.
Поиск подходящих вам модулей можно осуществлять не только на в поисковике (Google, Yandex и т.д.), в качестве базы для поиска можно использовать Pypi, LDF или GitHub. Pypi содержит в себе поисковик, который позволяет отыскать не только модули, но и любые их модификации. После их можно установить либо по называнию pip install , либо скачать файл *.whl , который содержит ваш модуль.
Установка из файла аналогичена установке по названию. Сначала вам нужно вам нужно переместится в папку, где хранится файл *.whl , используя команду cd , а затем применить команду pip install . На LDF хранятся модули в формате *.whl , некоторые из которых уже нельзя найти на Pypi.
Также необходимый модуль можно установить из исходников с помощью команды pip install https://github.com/// . Так например, мы можем поставить pillow вот такой командой: pip install https://github.com/python-pillow/Pillow/master.zip .
Используем картинки любых форматов и меняем их размер
Итак, удобнее всего открывать картинки с использованием библиотеки для работы с графикой Pillow.
Сперва библиотеку нужно установить. Для этого в консоли нужно выполнить команду:
pip3 install pillow
Если консоль попросит права администратора, можно установить библиотеку только для своего пользователя.
pip3 install --user pillow
После этого можно открывать файлы в любых форматах.
from tkinter import * # импортируем функционал для работы с картинками из pillow, которую мы только что установили from PIL import Image, ImageTk window = Tk() # открываем изображение любого формата и кладем его в переменную image_file image_file = Image.open("brothers.jpeg") # "готовим" изображение к размещению в окне и кладем в переменную vp_image vp_image = ImageTk.PhotoImage(image_file) # добавляем после и устанавливаем картинку в качестве фона Label(window, image=vp_image).pack() mainloop()

В качестве бонуса — изменить размер картинки теперь можно прямо в коде.
# открываем изображение любого формата и кладем его в переменную image_file image_file = Image.open("brothers.jpeg") # меняем размер картинки на 300 на 300 пикселей image_file = image_file.resize((300, 300), Image.LANCZOS) # "готовим" изображение к размещению в окне и кладем в переменную vp_image vp_image = ImageTk.PhotoImage(image_file)

Используем таймер, цвет и размер шрифта
Сейчас наше приложение умеет реагировать только на нажати кнопок, но часто приложениям требуется обновиться самостоятельно. Например, раз в несколько секунд.
Для этого можно попросить tkinter вызвать нашу функцию не после нажатия на кнопку, а просто через несколько миллисекунд или секунд. Делается это с помощью метода after() . В примере ниже попробуем обновлять случайное число раз в секунду.
import random from tkinter import * # функция, которая будет обновлять число на экране def update_number(): # генерируем и записываем число в текстовое поле label.config(text=random.randint(1, 100)) # просим window вызвать функцию update_number еще раз через секунду (1000 мс) window.after(1000, update_number) window = Tk() # создаем текстовое поле # дополнительно указываем шрифт (семейство - Comic Sans MS, 25 - размер) и цвет (fg - foreground color) # padx и pady (padding x, padding y) в параметрах pack - это отступы от справа/слева и сверху/снизу label = Label(window, font=("Comic Sans MS", 25), fg="green") label.pack(padx=50, pady=50) # просим window вызвать функцию update_number через секунду (1000 мс) window.after(1000, update_number) mainloop()
Программа выше будет раз в секунду менять число на экране.

Анимация
А что если совместить вывод изображений и таймер? Получится анимация!
Единственное, что нам потребуется для этого — научится изменять уже заданную картинку с помощью .configure() .
Делается это так:
img1 = ImageTk.PhotoImage(Image.open("face1.jpg")) img2 = ImageTk.PhotoImage(Image.open("face2.jpg")) image_label = Label(window, image=img1) image_label.pack() # когда хотим поменять картинку - вызываем configure image_label.configure(image=img2)
Ниже пример простой анимации — лицо меняется каждые 800 мс.
from tkinter import * from PIL import Image, ImageTk import psutil # функция, которая будет двигать картинки def next_img(): global pic_number # если номер был 0 - он станет 1, а если был 1 - станет 0 pic_number = (pic_number + 1) % 2 # в зависимости от номера, выбираем нужную картинку if pic_number == 0: # и устанавливаем ее в image_label image_label.configure(image=img1) if pic_number == 1: image_label.configure(image=img2) # через долю секунды - вызываем смену картинки снова window.after(800, next_img) window = Tk() window.title("FaceIt") # открываем две картинки и изменяем их размер до 300 пикселей img1 = ImageTk.PhotoImage(Image.open("face1.jpg").resize((300, 300), Image.ANTIALIAS)) img2 = ImageTk.PhotoImage(Image.open("face2.jpg").resize((300, 300), Image.ANTIALIAS)) # тут будем хранить номер картинки, которую показываем сейчас pic_number = 0 # чтобы иметь возможность менять картинку, сохраняем поле в переменную image_label image_label = Label(window, image=img1) image_label.pack() # спустя долю секунды просим поменять картинку - запустить функцию next_img window.after(800, next_img) mainloop()
Бонус! Как заставить тамагочи жить, даже если программа закрыта?
Можно вычислять состояние питомца исходя из времени прошлого кормления / игры / купания, а это время сохранять в файл. Для простоты давайте использовать отдельные файлы для каждого действия — кормежки / игры и тд. Ниже пример с едой, для остальных — по аналогии.
Как сохранить время действия в файл?
import time # предположим, мы только что покормили питомца, фиксируем сколько сейчас времени last_feed_time = time.time() # открываем файл для записи with open('last_feed_time.txt', 'w') as file: # превращаем время в строку и записываем в файл file.write(str(last_feed_time))
Как достать время последнего из файла?
import time # если файл существует try: # открываем файл для чтения with open('last_feed_time.txt', 'r') as file: # и считываем время прошлой кормежки last_feed_time = int(file.read()) # а если файла нет except: # считаем, что только покормили last_feed_time = time.time()
Как вычислить сколько сейчас «жизни» исходя из прошедшего времени?
import time # это значение нужно взфть из файла, для примера просто возьмем текущее время минус 40 секунд last_feed_time = time.time() - 40 # максимум "жизни" max_life = 100 # сколько секунд на одну единицу "жизни" seconds_for_life_point = 10 # сколько времени прошло с прошлого кормления elapsed_time = time.time() - last_feed_time # жизнь не может быть меньше нуля life = max(0, int(max_life - elapsed_time / seconds_for_life_point))
Бонус! Прогресс-бар для отображения статуса питомца.

from tkinter.ttk import * from tkinter import * from tkinter import messagebox life = 100 # Функция для уменьшения жизни каждую секунду def check_life(): global life # уменьшаем жизнь life -= 1 # узаписываем жизнь в прогрессбар progress['value'] = life # если жизни мало - закрываем приложение if life
Python. Работа с изображениями
Для работы с графическими изображениями в Python есть ряд библиотек, в частности, библиотека Pyllow. Если у вас уже установлен pip то поставить Pillow не составит труда, просто используем команду python -m pip install pillow, которая автоматически скачает и установит библиотеку. Для использования библиотек просто подключаем ее через импорт:
from PIL import Image
Самым важным классом в этой библиотеке — Image. Вот простейший пример использования, грузим картинку и отображаем ее на экране:
from PIL import Image img=Image.open('d:\\3\\10300013.png') img.show()
Отобразит Python картинку, правда, стандартными средствами операционной системы, просто показав окно с картинкой.
А теперь чуть более сложный пример. Пусть у нас есть два изображения, такое:


Объединим их, используя интерполяцию между новым и старым:
from PIL import Image im1 = Image.open('d:\\3\\10300013.png') im2 = Image.open('d:\\3\\10300014.png') Image.blend(im1, im2, 50).show()
Получив вот такой вот результат:

Третий параметр — это альфа. Попробуем поиграться с ним, задами, например 5:


Возможно, на данном примере не совсем понятно. Хорошо, попробуем изображения попроще. Вот у нас две картинки:


Наложим их друг на друга методом blend с альфой 2:


Библиотека позволяет также формировать изображения и сохранять их в файл:
from PIL import Image from PIL import ImageDraw text = "This is text" color = (0, 0, 120) img = Image.new('RGB', (100, 50), color) imgDrawer = ImageDraw.Draw(img) imgDrawer.text((10, 20), text) img.save("d:\\1\\pil-example.png")
Вот что сделает данный код:

Только на этот раз изображение будет не на экран выведено, а в файл по указанному пути.
Выведем формат, тип, размер изображения:
from PIL import Image from PIL import ImageDraw img = Image.open('d:\\3\\lena.jpg') #открываем картинку size = img.size #размер картинки format = img.format #формат картинки mode = img.mode #мод(RGBA. ) arr = [] #создаем пустой массив arr.append(size) #добавляем размер в массив arr.append(format) #добавляем формат в массив arr.append(mode) #добавляем мод в массив print(arr) #выводим массив
Любопытно, что можно конвертировать изображение из одного формата в другой, для этого достаточно открыть его и сохранить в нужном формате. Формат определяет расширение:
from PIL import Image from PIL import ImageDraw img = Image.open('d:\\3\\lena.jpg') #открываем картинку img.save('d:\\3\\test.gif')
Возможны и геометрические преобразования изображений, например, поворот на угол:
from PIL import Image from PIL import ImageDraw img = Image.open('d:\\3\\lena.jpg') #открываем картинку out = img.resize((128, 128)) out = img.rotate(25) # degrees counter-clockwise out.show()
Результатом работы данной программы будет повернутое изображение:

На этом пока все, но продолжение следует.
Как открыть картинку через Python?
Чтобы открыть картинку, используя приложение по умолчанию, на Windows:
#!/usr/bin/env python import os os.startfile(r'D:\picture.jpg')
Отслеживать
ответ дан 31 мар 2015 в 21:45
52.2k 11 11 золотых знаков 108 108 серебряных знаков 312 312 бронзовых знаков
Открыть наверное значит загрузить для показа (или обработки)? Если да то попробуйте через PIL, примерно так:
from PIL import Image #. img = Image.open(r'D:\picture.jpg') img.show()
Отслеживать
47.8k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
ответ дан 8 мар 2015 в 12:39
928 1 1 золотой знак 6 6 серебряных знаков 17 17 бронзовых знаков
Похоже, что человек хочет открыть ее в приложении по умолчанию, и при запуске из PyCharm что-то не так с окружением.
9 мар 2015 в 2:37
если использовать PIL, то картинка должна быть в папке с проектом?
9 мар 2015 в 14:09
Она может быть где угодно.
9 мар 2015 в 14:16
если обратный слэш есть в пути, то лучше r'' константу использовать (в данном случае это не важно, так как '\p' == r'\p' , но в общем случае '\t' != r'\t' ).
31 мар 2015 в 21:43
Попробуйте так (картинка откроется в веб-браузере):
import webbrowser webbrowser.open(r"D:\picture.jpg")
Отслеживать
47.8k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
ответ дан 17 мар 2015 в 4:36
Алексей Лобанов Алексей Лобанов
1,202 9 9 серебряных знаков 22 22 бронзовых знака
Вы можете это сделать, например, с помощью специализированных библиотек для обработки изображений и обработки данных. opencv требует установки дополнительных пакетов. Но, при этом, позволяет, помимо прочего, широкий спектр возможностей для обработки изображений. Вторая matplotlib устанавливается легко, интегрируется в pyCharm и позволяет использовать довольно удобный встроенный интерфейс для просмотра. К сожалению, эта библиотека не предоставляет возможности для обработки изображений, а только для их визуализации.

Opencv
import cv2 img = cv2.imread('x.jpg', 0) cv2.imshow('', img) cv2.waitKey(0)
matplotlib:
from matplotlib import pyplot as plt img = plt.imread('x.jpg') plt.imshow(img) plt.show()
matplotlib:


opencv:
Установка opencv:
sudo apt-get install -y cmake make libsm6 libxext6 libxrender-dev git clone https://github.com/opencv/opencv.git mkdir ./opencv/build cd ./opencv/build cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. make -j4 make install
Флаг j указывает число процессов, которые будут использованы при установке
Установка matplotlib:
pip install matplotlib pip install pillow
Если библиотека pillow не будет установлена, то можно будет пользоваться только * .png
Инструменты для работы с изображениями в Python и Pillow

Автор телеграм-канала CODE BLOG Вадим Шванов написал для нас статью о работе с изображениями c использованием языка Python и Pillow. В ней он рассматривает основы работы с изображениями в Python, показывает, как создать фильтры для фотографий в библиотеке Pillow, преобразовать изображение в массив в библиотеке NumPy и использовать matplotlib для настраиваемого вывода результата на экран. Дочитайте до конца: там вы найдете ссылку на .ipynb-документ со всем используемым кодом, который вы сможете загрузить.
Кому это нужно?
- создание своего фоторедактора;
- создание масок для Instagram;
- анализ и распознавание образов в компьютерном зрении.

Освойте профессию
«Fullstack-разработчик на Python»
Fullstack-разработчик на Python
Fullstack-разработчики могут в одиночку сделать IT-проект от архитектуры до интерфейса. Их навыки востребованы у работодателей, особенно в стартапах. Научитесь программировать на Python и JavaScript и создавайте сервисы с нуля.

Профессия / 12 месяцев
Fullstack-разработчик на Python
Создавайте веб-проекты самостоятельно

А я справлюсь?
В инструкции используются простые операции, поэтому она подойдет для новичков — достаточно уметь немного кодить на Python.
Установка пакетов
NumPy и matplotlib можно установить с помощью пакетного менеджера pip, запустив следующие команды в терминале:
pip install numpy
pip install matplotlib
С Pillow сложнее: Python старше версии 3.6 поддерживает установку этого пакета через pip, а с другими версиями может возникнуть ошибка. Совместимость версий можно посмотреть тут.
Для этого примера в качестве среды разработки выбран Jupyter Notebook.
Начало работы
Импортируйте все необходимые модули и загрузите изображение в объект Python:

Как правило, NumPy импортируется с псевдонимом np, а matplotlib.pyplot — plt.
Загрузите изображение с помощью функции open() подмодуля Image:

Jupyter Notebook выводит изображения по их имени. Вот то самое изображение, путь к которому мы передали в функцию:

Далее мы создадим свою функцию, чтобы у нас была возможность добавить надпись над фотографией (заголовок) или изменить ее размер.
Вывод изображений с matplotlib
Это функция, которую мы будем использовать далее:

Она принимает два параметра: img — массив, который вы получили из исходной фотографии, и title — заголовок, который по умолчанию имеет значение None. Измените размеры фигуры на 6×6, чтобы сделать вывод изображения больше, и выведите его на экран. Также проверьте, был ли указан заголовок. Если нет — установите его с помощью функции title(). Выключите пометки на осях, указав ‘off’ в функции axis().

Станьте Fullstack-разработчик на Python и найдите стабильную работу
на удаленке
Как сделать изображение черно-белым
Здесь мы будем использовать метод convert() класса изображения PIL.
Функция выглядит просто:

Мы представили изображение в RGB-формате, то есть каждый пиксель имеет три значения: красный (R), зеленый (G) и синий (B). Оттенки серого получаются, когда все эти три значения равны. Есть известная формула яркости пикселя:

Но Pillow использует свои коэффициенты:

Изображение потеряло в качестве из-за того, что его растянули с помощью matplotlib.

Станьте Fullstack-разработчик на Python и найдите стабильную работу
на удаленке
Как переформатировать изображение в массив
Теперь мы будем использовать инструменты NumPy, поэтому желательно конвертировать изображение в np.array:

Конструктор массива принимает изображение в качестве аргумента и создает такой массив. Форму массива можно узнать с помощью поля shape.

224×225 — размеры нашего изображения. «3» появляется из-за того, что каждый пиксель представлен тремя значениями.
Как добавить фильтр «Негатив»
Значения цветов могут меняться от 0 до 255. Негатив — эффект инвертирования цветов. Достигается он просто: от 255 нужно отнять значение цвета. Так как все операции над массивом NumPy выполняются поэлементно, то мы отнимем от 255 текущий массив:

С помощью функции show() оценим результат:

Как отзеркалить изображение
Следующая задача — отражение изображения слева направо (т. е. правая и левая стороны изображения меняются местами). В NumPy есть функция fliplr. Про ее применение можно найти информацию здесь.
Передайте исходный массив в fliplr:

Этот фрагмент кода не изменяет массив, а возвращает новый, что нам и нужно. Оценим результат работы:

Как добавить эффект
Идея этого эффекта проста — нужно сделать изображение как можно синее. Для этого замените каждое третье «значение пикселя» на максимальное — 255.

Здесь нужно поменять сам массив, и, чтобы не потерять исходное изображение, скопируйте последовательность с помощью np.copy().
Другой вариант конструкции:

Весь код из статьи вы сможете найти в этом документе.
