Разное

Python графические библиотеки: 3 библиотеки для создания графического интерфейса пользователя (GUI) – PyLab

Содержание

3 библиотеки для создания графического интерфейса пользователя (GUI) – PyLab

У большинства программистов наступает момент, когда они готовы отступить от базовых примеров и начать строить графический интерфейс для своей программы.

В Python начать GUI программирование просто, но первый шаг – это выбор пакета для создания GUI. К счастью, у программистов, которые хотят создать простой способ взаимодействия пользователей с их программами, есть много вариантов.

Но прежде всего задумайтесь: действительно ли нужно, чтобы ваше приложение имело традиционный графический интерфейс пользователя вообще? Для некоторых программ ответ очевиден. Если ваше приложение по своей природе графическое или будет запускаться локально на одной машине, то да, вам, вероятно, следует создать десктопный интерфейс. Часто это становится очевидным исходя из того, что вы проектируете.

Но для более общих программ, не сбрасывайте со счетов командную строку или веб-интерфейс.
Командная строка обладает многими преимуществами: скоростью, удаленным доступом, возможностью повторного использования, возможностью записи сценариев и контролем, что может быть более важным для пользователей вашего приложения, чем графический интерфейс, и существует множество библиотек, таких как, например, Click, Cement и Cliff, которые помогают создать великолепные программы командной строки.

То же самое с веб-интерфейсом. Даже для программы, предназначенной для локального запуска, это может быть решением – особенно, если есть вероятность, что пользователи могут разместить ваше приложение удаленно, а такие проекты, как Django, Flask или Pyramid, делают это просто.
Можно даже использовать библиотеку наподобие pywebview, чтобы обернуть веб-приложение в более естественное окно GUI.

Или еще можно использовать фреймворк Pyforms для создания единообразного представления в Интернете, командной строке и на рабочем столе, и это все на базе одного кода.

Все еще уверены, что хотите построить графический интерфейс? Отлично, вот три фантастических библиотеки с открытым исходным кодом.

PyQt

PyQt реализует популярную библиотеку Qt. Вы, возможно, уже знакомы с Qt – вы могли работать с Qt на другом языке. PyQt позволяет разрабатывать приложения на Python, и в то же время пользоваться инструментами и знаниями большого сообщества Qt.

PyQt имеет два вида лицензии – коммерческую и лицензию GPL, в отличие от самого проекта Qt.

Tkinter

Если бы был один пакет, который можно было бы назвать «стандартным» инструментарием GUI для Python, это был бы Tkinter. Tkinter – это оболочка вокруг Tcl / Tk, впервые появившегося в начале 90-х годов. Преимущество Tkinter – огромное количество ресурсов, включая книги и примеры кода, а также большое сообщество пользователей, которые могут помочь, если у вас есть вопросы. Примеры просты и понятны для новичка.

Tkinter доступен под лицензией Python, поверх лицензии BSD Tcl / Tk.

WxPython

WxPython переносит кросс-платформенную графическую библиотеку wxWidgets с родного языка C ++ на Python. WxPython – это немного более современный подход, который выглядит более натуральным, в разных операционных системах, чем, например, Tkinter, потому что он не пытается создать свой собственный набор виджетов (хотя они могут быть тематически похожими на его исходные компоненты). Он тоже прост в освоении, и сообщество разработчиков на WxPython посоянно растет.

WxPython использует wxWindows Library License своего родительского проекта, который одобрен OSI.

Это, конечно, не все доступные варианты. Десятки других опций есть на странице «Программирование GUI на Python» на официальной вики-странице Python Software Foundation.

А если захочется что-нибудь сделать что-нибудь не похожее на традиционное рабочее окно – например видео игру, то для этого в Python тоже есть хорошие библиотеки – например, pygame и pyglet.

Поделитесь с друзьями:

Работа с изображениями на Python

Тема сегодняшнего разговора — чему же научился Python за все годы своего существования в работе с изображениями. И действительно, кроме старичков родом из 1990 года ImageMagick и GraphicsMagick, есть современные эффективные библиотеки. Например, Pillow и более производительная Pillow-SIMD. Их активный разработчик Александр Карпинский (homm) на MoscowPython сравнил разные библиотеки для работы с изображениями на Python, представил бенчмарки и рассказал о неочевидных особенностях, которых всегда хватает. В этой статье расшифровка доклада, который поможет вам выбрать библиотеку под свое приложение, и сделать так, чтобы она работало максимально эффективно.

О спикере: Александр Карпинский работает в компании Uploadcare и занимается сервисом быстрой модификации изображений на лету. Участвует в разработке Pillow — популярной библиотеки для работы с изображениями на Python, развивает собственный форк этой библиотеки — Pillow-SIMD, который использует современные инструкции процессоров для наибольшей производительности.

Бэкграунд

Сервис модификации изображений в Uploadcare — это сервер, к которому приходит HTTP-запрос с идентификатором изображения и какими-то операциями, которые нужно выполнить клиенту. Сервер должен выполнить операции и как можно быстрее отдать ответ. В качестве клиента чаще всего выступает браузер.

Весь сервис можно описать как обертку вокруг графической библиотеки. Именно от качества, производительности и удобства использования графической библиотеки зависит качество всего проекта. Несложно догадаться, что в качестве графической библиотеки в Uploadcare используется Pillow.

Библиотеки

Кратко рассмотрим, какие вообще есть в Python библиотеки для работы с графикой, чтобы лучше понимать, о чем пойдет речь далее.

Pillow

Pillow — форк PIL (Python Imaging Library). Это очень старый проект, вышедший в 1995 году для Python 1.2. Можно представить, насколько он старый! В какой-то момент Python Imaging Library была заброшена, ее разработка прекратилась. Форк Pillow был сделан для того, чтобы устанавливать и собирать Python Imaging Library на современных системах. Постепенно количество изменений, которые нужны были людям в Python Imaging Library росло, и вышла Pillow 2.0, в которую была добавлена поддержка Python 3. Это можно считать началом отдельной жизни проекта Pillow.

Pillow представляет из себя нативный модуль для Python, половина кода написана на С, половина — на Python. Версии Python поддерживаются самые разнообразные: 2.7, 3.3+, PуPу, PуPуЗ.

Pillow-SIMD

Это мой форк Pillow, который выходит с мая 2016 года. SIMD означает Single Instruction, Multiple Data — подход, при котором процессор может выполнять большее количество действий на такт, используя современные инструкции.

Pillow-SIMD — это не форк в классическом понимании, когда проект начинает жить собственной жизнью. Это замена Pillow, то есть вы устанавливаете одну библиотеку вместо другой, ни строчки не меняете в своем исходном коде, и получаете большую производительность.

Pillow-SIMD можно собирать с инструкциями SSE4 (по умолчанию). Это набор инструкций, который есть практически во всех современных x86 процессорах. Также Pillow-SIMD можно собирать с набором инструкций AVX2. Этот набор инструкций есть, начиная с архитектуры Haswell, то есть примерно с 2013 года.

OpenCV

Другая библиотека для работы с изображениями в Python, о которой вы наверняка слышали — это OpenCV (Open Computer Vision). Работает с 2000 года. Биндинг на Python входит в комплект. Это означает, что биндинг постоянно актуален, не бывает рассинхронности между самой библиотекой и биндингом.

К сожалению, эта библиотека пока не поддерживается в PyPy, потому что OpenCV базируется на numpy, а numpy только недавно стал работать под PyPy, и в OpenCV поддержки PyPy все еще нет.

VIPS

Еще одна библиотека, на которую стоит обратить внимание — VIPS. Основная идея VIPS в том, что для работы с изображением не нужно загружать всё изображение в память. Библиотека может загружать какие-то маленькие кусочки, обрабатывать их и сохранять. Таким образом, для обработки гигапиксельных изображений не нужно тратить гигабайты памяти.

Это довольно старая библиотека — 1993 года, но она обогнала своё время. О ней долгое время было мало, что слышно, но в последнее время для VIPS стали появляться биндинги под разные языки, в том числе для Go, Node.js, Ruby.

Я долгое время хотел попробовать эту библиотеку, пощупать, но мне это не удавалось по очень глупой причине. Я не мог разобраться, как установить VIPS, потому что биндинг собирался очень сложно. Но теперь (в 2017 году) вышел биндинг pyvips от автора самого VIPS, с которым уже нет никаких проблем. Теперь установка и использование VIPS очень простая. Поддерживаются: Python 2.7, 3.3+, PуPу, PуPуЗ.

ImageMagick & GraphicsMagick

Если говорить о работе с графикой, то нельзя не упомянуть старичков — библиотеки ImageMagick и GraphicsMagick. Последняя изначально была форком ImageMagick с большей производительностью, но сейчас производительность у них, кажется, сравнялась. Других принципиальных отличий, насколько я знаю, между ними нет. Поэтому можно использовать любую, точнее, ту, которую вам удобнее использовать.

Это самые старые библиотеки из тех, о которых я сегодня упомянул (1990 год). За все это время было несколько биндингов для Python, и почти все из них благополучно умерли к настоящему моменту. Из тех, что можно использовать, остались:

  • Биндинг Wand, который построен на ctypes, но уже тоже не обновляется.
  • Биндинг pgmagick использует Boost.Python, поэтому компилируется очень долго и не работает в PyPy. Но, тем не менее, использовать его можно, я бы сказал, что он предпочтительнее, чем Wand.

Производительность

Когда мы говорим о работе с изображениями, первое, что нам интересно (по крайней мере мне) — это производительность, потому что иначе мы бы могли и на Python написать что-нибудь руками.

Производительность — это не такая простая штука. Нельзя просто сказать, что одна библиотека работает быстрее другой. В каждой библиотеке есть набор функций, и каждая функция работает с разной скоростью.

Соответственно, корректно говорить только о том, что производительность одной функции выше или ниже в конкретной библиотеке. Либо у вас есть приложение, которому нужен некий набор функциональности, и вы делаете бенчмарк именно под эту функциональность, и говорите, что для вашего приложения такая-то библиотека работает быстрее (медленнее).

Важно проверять результат

Когда вы делаете бенчмарки, очень важно смотреть на результат, который получается. Даже если с первого взгляда вы написали один и тот же код, это не значит, что он одинаковый.

Недавно в статье, где сравнивалась производительность Pillow и OpenCV, мне попался такой код:

from PIL import Image, ImageFilter.BoxBlur
im.filter(ImageFilter.BoxBlur(3))
...

import cv2
cv2.blur(im, ksize=(3, 3))
...

Вроде бы и там, и там, BoxBlur, и там, и там аргумент 3, но на самом деле результат разный. Потому что в Pillow (3) — это радиус размытия, а в OpenCV ksize=(3, 3) — это размер ядра, то есть, грубо говоря, диаметр. В данном случае корректное значение для OpenCV было бы 3*2+1, то есть (7, 7).

В чем проблема?

Почему вообще производительность — это проблема при работе с графикой? Потому что сложность любой операций зависит от нескольких параметров, и чаще всего сложность растет линейно с каждым из них. А если этих факторов, например, три, и сложность линейно зависит от каждого, то получается сложность в кубе.

Пример: Гауссово размытие в OpenCV.

Слева — радиус 3, справа — 30. Как видно, разница в скорости более чем в 10 раз.

Когда передо мной встала задача добавить размытие по Гауссу в мое приложение, меня не устраивало, что гипотетически может тратиться 900 мс на выполнение одной операции. Таких операций в приложении тысячи в минуту, и тратить столько времени на одну — нецелесообразно. Поэтому я изучил вопрос и реализовал в Pillow размытие по Гауссу, которое работает за константное время относительно радиуса. То есть на производительность Гауссова размытия влияет только размер картинки.

Но здесь главное не то, что что-то работает быстрее или медленнее.

Я хочу донести, что, когда вы строите какую-то систему, важно понимать, от каких параметров зависит сложность на выходе. Тогда вы сможете ограничить эти параметры или другими способами бороться с этой сложностью.

Наверное, самая частая операция, которую мы делаем с изображениями после их открытия, — это изменение размера (resize).

На графике представлена производительность (больше — лучше) разных библиотек для операции уменьшения изображения в 8 и в 1,25 раз.

Для PIL результат 17 Mpx/s означает, что фотографию с айфона (12 Mpx) можно уменьшить в 1,25 раз чуть меньше, чем за секунду. Такой производительности недостаточно для серьезного приложения, которое этих операций выполняет очень много.

Я стал оптимизировать производительность ресайза, и в Pillow 2.7 мне удалось добиться двукратного прироста производительности, а в Pillow 4.3 — трехкратного (на данный момент актуальна версия Pillow 5.3, но производительность ресайза в ней та же).

Но операция ресайза — это такая штука, которая очень хорошо ложится на SIMD. Она подходит к single instruction, multiple data, и поэтому в текущей версии Pillow-SIMD мне удалось в 19 раз увеличить скорость ресайза по сравнению с оригинальной Python Imaging Library при использовании тех же самых ресурсов.

Это существенно выше производительности ресайза в OpenCV. Но сравнение это не совсем корректное, потому что в OpenCV используется чуть менее качественный способ ресайза бокс-фильтром, а в Pillow-SIMD ресайз реализован с помощью сверток.

Это неполный список тех операций, которые ускорены в Pillow-SIMD по сравнению с обычной Pillow.

  • Ресайз: от 4 до 7 раз.
  • Размытие: 2,8 раз.
  • Применение ядра 3×3 или 5×5: 11 раз.
  • Умножение и деление на альфа-канал: 4 и 10 раз.
  • Альфа-композиция: 5 раз.

Я уже сказал, что нельзя говорить, что какая-то библиотека работает быстрее, чем другая, но можно составить какой-то набор операций, который интересен именно вам. Я выбрал набор операций, которые интересны в моем приложении, сделал бенчмарк и получил такие результаты.

Оказалось, что Pillow-SIMD на этом наборе работает в 2 раза быстрее, чем Pillow. В самом конце находится Wand (напомню, что это ImageMagick).

Но меня заинтересовало другое — почему такие низкие результаты у OpenCV и VIPS, ведь это библиотеки, которые тоже разработаны с прицелом на производительность? Оказалось, что в случае OpenCV, та бинарная сборка OpenCV, которая ставится с помощью pip, собрана с медленным кодеком JPEG (автор сборки был уведомлен, на 2018 год эта проблема уже решена). Она собрана с libjpeg, в то время как в большинстве систем, по крайней мере debian-based, используется libjpeg-turbo, которая работает в несколько раз быстрее. Если собрать OpenCV из исходников самому, то производительность будет больше.

В случае VIPS ситуация другая. Я связался с автором VIPS, показал ему этот бенчмарк, мы с ним довольно долго и плодотворно переписывались. После чего автор VIPS нашел несколько мест в самом VIPS, где исполнение было не по оптимальному маршруту, и исправил их.

Вот что будет с производительностью, если собрать OpenCV из исходников текущей версии, а VIPS — из master, который уже есть сейчас.

Даже если вы нашли какой-то бенчмарк, еще не факт, что все будет работать именно с такой скоростью именно на вашей машине.

Набор бенчмарков

Все бенчмарки, о которых я рассказал, можно найти на странице с результатами. Это отдельный мини-проект, где я пишу бенчмарки, которые мне самому нужны для разработки Pillow-SIMD, запускаю их и выкладываю результаты.

На GitHub есть проект с фреймворками для тестирования, где каждый может предложить свои бенчмарки или поправить существующие.

Параллельная работа

До сих пор я говорил о производительности в чистом виде, то есть на одно ядро процессора. Но нам всем давно доступны системы с бо́льшим количеством ядер, и хотелось бы их утилизировать. Здесь я должен сказать, что на самом деле Pillow — это единственная из всех рассматриваемых библиотек, которая не использует распараллеливание задач. Я сейчас постараюсь объяснить, почему так происходит. Все остальные библиотеки в том или ином виде его используют.

Метрики производительности

С точки зрения производительности нам интересны 2 параметра:

  1. Реальное время выполнения одной операции. Есть операция (либо последовательность операций), и вам интересно, за какое реальное время (wall clock) выполнится эта последовательность. Этот параметр важен на десктопе, где есть пользователь, который отдал команду и ждет результат.
  2. Пропускная способность всей системы (потока операций). Когда у вас есть набор операций, который идет постоянно, либо много независимых операций, и вам важна скорость обработки этих операций на вашем железе. Эта метрика более важна на сервере, где клиентов много, и нужно обслужить их всех. Время обслуживания одного клиента, конечно, важно, но чуть меньше, чем общая пропускная способность.

Исходя из этих двух метрик рассмотрим разные способы параллельной работы.

Способы параллельной работы

  1. На уровне приложения, когда вы на уровне приложения решаете, что операции обрабатываются в разных потоках. При этом реальное время выполнения одной операции не меняется, потому что по-прежнему одно ядро занимается одной последовательностью операций. Пропускная способность системы растет пропорционально количеству ядер, то есть очень хорошо.

  2. На уровне графических операций — то, что как раз есть в большинстве графических библиотек. Когда графическая библиотека получает какую-то операцию, она внутри себя создает необходимое количество потоков, разбивает одну операцию на несколько более мелких, и выполняет их. При этом реальное время выполнения уменьшается — одна операция выполняется быстрее. Но пропускная способность растет далеко не линейно от количества ядер. Есть операции, которые не параллелятся, и яркий пример — это декодирование PNG-файлов — его никак нельзя распараллелить. Кроме того, есть накладные расходы на создание потоков, разбиение задач, которые тоже не дают пропускной способности расти линейно.

  3. На уровне команд процессора и данных. Мы специальным образом подготавливаем данные и используем специальные команды, для того чтобы процессор работал с ними быстрее. Это подход SIMD, который, собственно, и используется в Pillow-SIMD. Реальное время выполнения уменьшается, пропускная способность растет — это беспроигрышный вариант.

Как совместить параллельную работу

Если мы хотим совместить как-то параллельную работу, то SIMD хорошо совмещается с распараллеливанием внутри операции, и SIMD хорошо совмещается с распараллеливанием внутри приложения.

Но распараллеливание внутри приложения и внутри операции друг с другом не совмещаются. Если вы попробуете это сделать, то получите минусы от обоих подходов. Реальное время выполнения операции будет таким же, каким оно и было на одном ядре, а пропускная способность системы вырастет, но не линейно относительно количества ядер.

Многопоточность

Если уж мы заговорили про потоки — мы все пишем на Python и знаем, что в нем есть GIL, который не дает выполняться двум потокам одновременно. Python — это строго однопоточный язык.

Конечно, это не правда, потому что GIL на самом деле не дает выполняться двум потокам на Python, а если код написан на другом языке, и во время своей работы не использует внутренние структуры Python, то этот код может отпускать GIL и таким образом освобождать интерпретатор под другие задачи.

Многие библиотеки для работы с графикой освобождают GIL во время своей работы, в том числе Pillow, OpenCV, pyvips, Wand. Не освобождает только одна — pgmagick. То есть вы можете спокойно создавать потоки под выполнение каких-то операций, и это будет работать параллельно с остальным кодом.

Но возникает вопрос: сколько создавать потоков?

Если мы будем создавать бесконечное количество потоков под каждую задачу, которая у нас есть, то они просто займут всю память и весь процессор, — мы не получим никакой эффективной работы. Я сформулировал специальное правило.

Правило N + 1

Для продуктивной работы нужно создавать не более N + 1 воркеров, где N — количество ядер или потоков процессора на машине, а воркер — это процесс или поток, занятый обработкой.

Лучше всего использовать именно процессы, потому что даже в рамках одного интерпретатора есть узкие места и накладные расходы.

Например, у нас в приложении используется N + 1 instance Tornado, балансировку между которыми осуществляет ngnix. Если упомянуто Tornado, то давайте поговорим об асинхронной работе.

Асинхронная работа

То время, которое графическая библиотека занимается собственно полезной работой — обработкой изображений — можно и нужно использовать для ввода/вывода, если они есть у вас в приложении. Асинхронные фреймворки здесь очень в тему.

Но есть проблема — когда мы вызываем какую-то обработку, она вызывается синхронно. Даже если библиотека отпускает в этот момент GIL, все равно Event Loop блокируется.

@gen.coroutine
def get(self, *args, **kwargs):
    im = process_image(...)
    ...

К счастью, эту проблему очень легко решить созданием ThreadPoolExecutor с одним тредом, на котором запускается обработка изображения. Этот вызов уже происходит асинхронно.

@run_on_executor(executor=ThreadPoolExecutor(1))
def process_image(self,
    ...
@gen.coroutine
def get(self, *args, **kwargs):
    im = yield process_image(...)
    ...

По сути здесь создается очередь с одним воркером, который выполняет именно графические операции, а Event Loop не блокируется и спокойно работает параллельно в другом потоке.

Ввод/Вывод

Еще одна тема, которую я бы хотел затронуть в рамках разговора о графических операциях — это ввод/вывод. Дело в том, что мы редко создаем какие-то изображения с помощью графической библиотеки. Чаще всего мы открываем изображения, которые пришли к нам от пользователей в виде закодированных файлов (JPEG, PNG, BMP, TIFF и пр.).

Соответственно, графическая библиотека для построения хорошего приложения должна обладать некоторыми плюшками по вводу/выводу именно из файлов.

Ленивая загрузка

Первая такая плюшка — это ленивая загрузка. Если, например, в Pillow вы открываете изображение, то в этот момент не происходит декодирования картинки. Вам возвращается объект, который выглядит, как будто изображение уже загружено и работает. Вы можете посмотреть его свойства и решить на основании свойств этого изображения, готовы ли вы с ним работать дальше, не загрузил ли вам пользователь, например, гигапиксельную картинку для того, чтобы сломать ваш сервис.

>>> from PIL import Image
>>> %time im = Image.open()
Wall time: 1.2 ms
>>> im.mode, im.size
('RGB', (2152, 1345))

Если вы принимаете решение, что дальше работаете, то с помощью явного или неявного вызова load происходит декодирование этого изображения. Уже в этот момент выделяется нужное количество памяти.

>>> from PIL import Image
>>> %time im = Image.open()
Wall time: 1.2 ms
>>> im.mode, im.size
('RGB', (2152, 1345))
>>> %time im.load()
Wall time: 73.6 ms

Режим битых картинок

Вторая плюшка, которая нужна при работе с пользовательским контентом — это режим битых картинок. Файлы, которые мы получаем от пользователей, очень часто содержат какие-то несоответствия с форматом, в котором они закодированы.

Эти несоответствия бывают по разным причинам. Иногда это ошибки передачи по сети, иногда — просто какие-то кривые кодеки, которыми кодировалось изображение. По умолчанию Pillow, когда видит изображения, которые не соответствуют формату до конца, просто кидает исключение.

from PIL import Image
Image.open('trucated.jpg').save('trucated.out.jpg') 
IOError: image file is truncated (143 bytes not processed)

Но пользователь же не виноват в том, что у него картинка битая, он все равно хочет получить результат. К счастью, у Pillow есть режим битых картинок. Мы меняем одну настройку, и Pillow старается по максимуму игнорировать все ошибки декодирования, которые есть в изображении. Соответственно, пользователь видит хотя бы что-то.

from PIL import Image, ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
Image.open('trucated.jpg').save('trucated.out.jpg')

Даже обрезанная картинка — это все равно лучше, чем ничего — просто страница с ошибкой.

Сводная таблица

В таблице выше я собрал все, что касается ввода/вывода в тех библиотеках, о которых я рассказываю. В частности, я посчитал количество кодеков различных форматов, которые есть в библиотеках. Получилось, что в OpenCV их меньше всех, в ImageMagick — больше всех. Похоже, что в ImageMagick можно открыть вообще любое изображение, которое вам встретится. У VIPS 12 собственных кодеков, но VIPS может использовать ImageMagick в качестве промежуточного звена. Я не проверял, как это работает, надеюсь, что бесшовно.

В Pillow 17 кодеков. Это сейчас единственная библиотека, в которой нет автоповорота EXIF. Но сейчас это небольшая проблема, потому что можно прочитать EXIF самому и повернуть изображение в соответствии с ним. Это вопрос небольшого сниппета, который легко гуглится и занимает максимум в 20 строчек.

Особенности OpenCV

Если посмотреть на эту таблицу внимательно, то видно, что в OpenCV на самом деле не все так хорошо с вводом/выводом. В нем меньше всего кодеков, нет ленивой загрузки и нельзя прочитать EXIF и цветовой профиль.

Но это не все. На самом деле у OpenCV есть еще особенности. Когда мы просто открываем какую-то картинку, то вызов cv2.imread(filename) поворачивает JPEG-файлы в соответствии с EXIF (см. таблицу), но при этом игнорирует альфа-канал у PNG-файлов — довольно странное поведение!

К счастью, в OpenCV есть флаг: cv2.imread(filename, flags=cv2.IMREAD_UNCHANGED).

Если указать флаг IMREAD_UNCHANGED, то OpenCV оставляет альфа-канал у PNG-файлов, но перестает поворачивать JPEG-файлы в соответствии с EXIF. То есть один и тот же флаг влияет на два совершенно разных свойства. Как видно из таблицы, у OpenCV нет возможности прочитать EXIF, и получается, что в случае с этим флагом невозможно повернуть JPEG вообще.

Что делать, если вы заранее не знаете, какого формата у вас изображение, и вам нужны и альфа-канал у PNG, и автоповорот у JPEG? Ничего не сделать — OpenCV так не работает.

Причина, почему в OpenCV такие проблемы, кроется в названии этой библиотеки. В ней очень много функциональности для компьютерного зрения и анализа изображений. По сути, OpenCV рассчитана на работу с верифицированными источниками. Это, например, камера наружного наблюдения, которая раз в секунду скидывает изображения, и делает это в течение 5 лет в одном и том же формате и одном и том же разрешении. Здесь не нужна вариативность в вопросе ввода/вывода.

Людям, которым нужна функциональность OpenCV, не сильно нужна функциональность работы с пользовательским контентом.

Но что делать, если в вашем приложении все-таки нужна функциональность работы с пользовательским контентом, и в то же время нужна вся мощь OpenCV по обработке и статистике?

Решение в том, что нужно совмещать библиотеки. Дело в том, что OpenCV построен на базе numpy, и в Pillow есть все средства для того, чтобы экспортировать изображения из Pillow в массив numpy. То есть мы экспортируем массив numpy, и OpenCV может дальше работать с этим изображением, как со своим собственным. Это делается очень легко:

import numpy
from PIL import Image
...
pillow_image = Image.open(filename)
cv_image = numpy.array(pillow_image)

Дальше, когда мы делаем магию с помощью OpenCV (обработку), мы вызываем еще один метод Pillow и обратно импортируем из OpenCV картинку в формат Pillow. Соответственно, можно снова пользоваться вводом/выводом.

import numpy
from PIL import Image
...
pillow_image = Image.fromarray(cv_image, "RGB")
pillow_image.save(filename)

Таким образом получается, что мы пользуемся вводом/выводом от Pillow, и процессингом от OpenCV, то есть берем лучшее из двух миров.

Надеюсь, это поможет вам построить нагруженное приложение для работы с графикой.

Узнать некоторые другие секреты разработки на Python, перенять бесценный и местами неожиданный опыт, а главное обсудить свои задачи можно будет уже совсем скоро на Moscow Python Conf++. Например, обратите внимание на такие имена и темы в расписании.

  • Donald Whyte с историей о том, как с помощью популярных библиотек, хитрости и коварства делать математику в 10 раз быстрее, а код — понятным и поддерживаемым.
  • Андрей Попов про сбор огромного количества данных и их анализ на наличие угроз.
  • Ефрем Матосян в своем докладе «Make Python fast again» расскажет, как увеличить производительность демона, обрабатывающего сообщения из шины.


Полной список того, что предстоит обсудить за 22 и 23 октября тут, успевайте присоединиться.

Tkinter — создание графического интерфейса в Python

В Python есть довольно много GUI фреймворков (graphical user interface), однако только Tkinter встроен в стандартную библиотеку языка. У Tkinter есть несколько преимуществ. Он кроссплатформенный, поэтому один и тот же код можно использовать на Windows, macOS и Linux.

Визуальные элементы отображаются через собственные элементы текущей операционной системы, поэтому приложения, созданные с помощью Tkinter, выглядят так, как будто они принадлежат той платформе, на которой они работают.

Хотя Tkinter является популярным GUI фреймворком на Python, у него есть свои недостатки. Один из них заключается в том, что графические интерфейсы, созданные с использованием Tkinter, выглядят устаревшими. Если вам нужен современный, броский интерфейс, то Tkinter может оказаться не совсем тем, для этого есть PyQt5 который развивается сильнее в данном плане.

Тем не менее, в плане использования, Tkinter является относительно легким по сравнению с другими библиотеками. Это отличный выбор для создания GUI приложений в Python, особенно если современный облик не в приоритете для программы, а большую роль играет функциональность и кроссплатформенная скорость.

Другие статьи по Tkinter на сайте

  1. Создание окна по центру и кнопка выхода в Tkinter
  2. Разметка виджетов в Tkinter — pack, grid и place
  3. Виджеты Checkbutton, Label, Scale и Listbox в Tkinter
  4. Меню, подменю и панель инструментов в Tkinter
  5. Диалоговые окна в Tkinter
  6. Рисуем линии, прямоугольники, круг и текст в Tkinter
  7. Пишем игру змейка на Tkinter

Основные аспекты руководства

  • Введение и создание простого приложения «Hello, World!» в Tkinter;
  • Работа с виджетами вроде кнопок или текстовых боксов;
  • Управление макетом приложений через геометрические менеджеры;
  • Создание интерактивного приложения через связывание кнопок с функциями Python.

После освоения основных навыков в процессе изучения примеров, данных в руководстве, вы сможете создать два рабочих приложения. Одно будет конвертером температуры, а второе редактором текста. Что ж, приступим!

Создание простого GUI приложения на Tkinter

Главным элементом GUI Tkinter является окно. Окнами называют контейнеры, в которых находятся все GUI элементы. Данные GUI элементы, к числу которых относятся текстовые боксы, ярлыки и кнопки, называются виджетами. Виджеты помещаются внутри окон.

Сперва создадим окно с одним виджетом. Запустим новую сессию оболочки Python, следуя инструкции.

На заметку: Примеры кода, используемые в руководстве, были протестированы на Windows, macOS и Ubuntu Linux 18.04 через версии Python 3.6, 3.7 и 3.8.

В случае, если вы установили Python на Windows или macOS, скачав установщик c официального сайта python.org, проблем с запуском кода из примеров возникнуть не должно. Можете пропустить оставшуюся часть заметки и перейти к самому руководству.

В случае, если ввиду отсутствия официальных дистрибутивов Python для вашей системы, вы установили Python иным образом, тогда обратите внимание на следующие моменты.

Установка Python на macOS используя Homebrew:

Дистрибутив Python для macOS, доступный на Homebrew, поставляется без библиотеки Tcl/Tk с Tkinter. Вместо этого используется версия системы по умолчанию. Версия может быть устаревшей и не позволяющей импортировать модуль Tkinter в Python. Во избежание такой проблемы, используйте официальный установщик macOS.

Ubuntu Linux 16.04:

Последняя версия Python доступна на Ubuntu Linux 16.04, это 3.5. Вы можете установить последнюю версию через deadsnakes PPA. Далее даны команды для установки PPA и загрузки последней версии Python с правильной версией Tcl/Tk:


$ sudo add-apt-repository ppa:deadsnakes/ppa
$ sudo apt-get update
$ sudo apt-get install python3.8 python3-tk



$ sudo add-apt-repository ppa:deadsnakes/ppa

$ sudo apt-get update

$ sudo apt-get install python3.8 python3-tk


Первые две команды добавляют deadsnakes PPA в ваш системный список репозитория, а последняя команда устанавливает Python 3.8 и модуль GUI Tkinter.

Ubuntu Linux 18.04:

Вы можете установить последнюю версию Python с соответствующей версией Tcl/Tk из универсального репозитория через следующую команду:


$ sudo apt-get install python3.8 python3-tk



$ sudo apt-get install python3.8 python3-tk


Таким образом устанавливается Python 3.8, а также модуль Tkinter.

Прочие версии Linux:

Если на данный момент нет официального рабочего установщика Python для Linux дистрибутива, то можете поставить Python вместе с соответствующей версией Tcl/Tk через исходный код. С пошаговой инструкцией процесса можете ознакомиться на странице: Установка Python 3.8 из исходного кода на Linux

В открытой оболочке IDLE Python первым делом необходимо импортировать модуль Tkinter:

Окно, или window является экземпляром класса Tkinter. Попробуйте создать новое окно, присвоив его переменной окна window:

При выполнении вышеуказанного кода на экране появится новое окно. То, как оно будет выглядеть, зависит от вашей операционной системы:

Далее в руководстве будут представлены из операционной системы Ubuntu.

Добавление нового виджета в приложении

Теперь, когда у вас есть окно, можно добавить на него виджет. Используем класс tk.Label и добавим какой либо текст на окно.

Создадим виджет ярлыка (label) с текстом "Привет, Tkinter!" и присвоим его переменной под названием greeting:

>>> greeting = tk.Label(text=»Привет, Tkinter!»)



>>> greeting = tk.Label(text=»Привет, Tkinter!»)

Созданное ранее окно не меняется. Создается виджет ярлыка, однако пока не добавляется на окно. Есть несколько способов добавления виджетов на окно. Сейчас можно использовать метод .pack() от виджета ярлыка:

Теперь окно выглядит следующим образом:

При использовании метода .pack() для размещения виджета в окне, Tkinter устанавливает размер окна настолько маленьким, насколько возможно, пока в него не влезает виджет. Теперь выполним следующее:

Кажется, будто ничего не случилось, но это не совсем так. window.mainloop() указывает Python, что нужно запустить цикл событий Tkinter. Данный метод требуется для событий вроде нажатий на клавиши или кнопки, он также блокирует запуск любого кода, что следует после, пока окно, на котором оно было вызвано, не будет закрыто. Попробуйте закрыть созданное окно, и вы увидите появившуюся в оболочке подсказку.

Внимание: При работе с Tkinter из Python REPL окна обновляются при выполнении каждой строки. Однако, если программа Tkinter выполняется из запущенного файла, такого не происходит.

Если не добавлять window.mainloop() в конец программы в Python файле, тогда приложение Tkinter не запустится вообще, и ничего не будет отображаться.

Для создания окна в Tkinter, нужно всего несколько строк кода. Тем не менее, в пустое окно нам ничем не поможет! В следующем разделе будут рассмотрены некоторые виджеты, доступные в Tkinter, а также способы их настройки при добавлении в приложение.

Задание #1 Создать обычное окно в Tkinter

Выполните небольшое задание, чтобы проверить свои знания.

Напишите полный скрипт для создания окна в Tkinter с текстом «Python рулит!». Окно должно выглядеть следующим образом:

Попробуйте выполнить задание самостоятельно. Затем можете сравнить свой код с решением, представленным ниже. Помните, что у каждого программиста есть свой стиль, и ваша программа вовсе не обязана выглядеть точно так же, как код из следующего примера.

Код с решением

import tkinter as tk

window = tk.Tk()
label = tk.Label(text=»Python рулит!»)
label.pack()

window.mainloop()



import tkinter as tk

 

window = tk.Tk()

label = tk.Label(text=»Python рулит!»)

label.pack()

 

window.mainloop()

Работа с виджетами в Tkinter

Виджеты являются основой GUI фреймворка Tkinter в Python. Это элементы, через которые пользователи взаимодействуют с программой. В Tkinter каждый виджет определен классом. Далее представлен список популярных виджетов из Tkinter:

Класс виджетаОписание
LabelИспользуется для отображения текста или вставки изображения на окне приложения.
ButtonКнопка, на которой может быть текст, совершает определенные действия при нажатии на нее.
EntryВиджет для ввода одной строчки текста. Эквивалент <input type="text"> в HTML.
TextВиджет для ввода большого текста. Эквивалент <textarea> в HTML.
FrameПрямоугольная область, что используется для группировки виджетов или для добавления расстояния между виджетами.

В дальнейшем, мы на практике рассмотрим, как действует каждый из представленных выше виджетов. С более подробными списками виджетов Tkinter можете ознакомиться на страницах Basic Widgets и More Widgets. А пока рассмотрим подробнее виджет ярлыка Label.

Виджет Label — Отображение текста и картинок

Виджеты Label используется для отображения текста или картинок. Текст на виджете Label, не может редактироваться пользователем. Он только показывается. Как было показано в примере в начале данного руководства, виджет Label можно создать через экземпляр класса Label и передачу строки в параметр text:

label = tk.Label(text=»Hello, Tkinter»)



label = tk.Label(text=»Hello, Tkinter»)

Виджеты Label отображают текст с установленным по умолчанию системным цветом и фоном. Обычно это черный и белый цвета. Следовательно, если в вашей операционной системе указаны иные цвета, именно их вы и увидите.

Изменить цвет текста и фона виджета Label можно через параметры foreground и background:

label = tk.Label(
text=»Привет, Tkinter!»,
foreground=»white», # Устанавливает белый текст
background=»black» # Устанавливает черный фон
)



label = tk.Label(

    text=»Привет, Tkinter!»,

    foreground=»white»,  # Устанавливает белый текст

    background=»black»  # Устанавливает черный фон

)

Некоторые доступные цвета:

  • red — красный;
  • orange — оранжевый;
  • yellow — желтый;
  • green — зеленый;
  • blue — синий;
  • purple — сиреневый.

Многие HTML-цвета имеют такое же название в Tkinter. Со списком доступных названий цветов можете ознакомиться здесь.

Если хотите подробнее разобраться в теме, особенно в системных цветах macOS и Windows, контролируемых текущей темой ОС, ознакомьтесь со страницей значений цветов.

Вы также можете указать цвет, используя шестнадцатеричные значения RGB такое часто используется в CSS для стилизации сайтов:

label = tk.Label(text=»Привет, Tkinter!», background=»#34A2FE»)



label = tk.Label(text=»Привет, Tkinter!», background=»#34A2FE»)

Теперь фон стал приятного голубого цвета. Шестнадцатеричные значения RGB, в отличие от названий цветов, закодированы, но это делает их более управляемыми. К счастью, доступны инструменты для простого и быстрого получения шестнадцатеричных кодов цветов.

Если вам не хочется регулярно вводить foreground и background, можете использовать сокращенные версии параметров — fg и bg. Они точно также отвечают за установку цвета текста и цвета фона.

label = tk.Label(text=»Привет, Tkinter!», fg=»white», bg=»black»)



label = tk.Label(text=»Привет, Tkinter!», fg=»white», bg=»black»)

Вы также можете управлять шириной и высотой ярлыка с помощью параметров width и height:

import tkinter as tk

window = tk.Tk()

label = tk.Label(
text=»Привет, Tkinter!»,
fg=»white»,
bg=»black»,
width=20,
height=20
)

label.pack()
window.mainloop()



import tkinter as tk

 

window = tk.Tk()

 

label = tk.Label(

    text=»Привет, Tkinter!»,

    fg=»white»,

    bg=»black»,

    width=20,

    height=20

)

 

label.pack()

window.mainloop()

В окне, ярлык будет выглядеть следующим образом:

Может показаться странным, что ярлык в окне не является квадратным, хотя параметр как ширины, так и высоты равен 20. Все оттого, что ширина и высота измеряются в текстовых юнитах.

Горизонтальный текстовый юнит определен шириной символа "0", или цифрой ноль, в шрифте системы по умолчанию. Аналогичным образом один вертикальный текстовый юнит определен высотой символа "0".

На заметку: Tkinter использует текстовые юниты для измерения ширины и высоты вместо дюймов, сантиметров или пикселей, чтобы обеспечить согласованное поведение приложения на разных платформах.

Измерение юнитов шириной символа означает, что размер виджета относительно шрифта определяется по умолчанию на компьютере пользователя. Это обеспечивает правильное размещение текста на ярлыках и кнопках независимо от того, где запущено приложение.

Ярлыки отлично подходят для отображения текста, но через них пользователь не может вводить данные. Следующие три виджета позволяют пользователю вводить информацию.

Создание кнопки через виджет Button

Виджеты Button нужны для создания кликабельных кнопок. Их можно настроить таким образом, чтобы при нажатии вызывалась определенная функция. В следующей части урока, будет рассмотрено, как именно вызвать функцию при нажатии на кнопку. А пока займемся стилизацией виджета кнопки.

Существует много сходств между виджетами Button и Label. По сути кнопка — это просто ярлык, на который можно кликнуть. Для создания стилей виджетов ярлыка и кнопки также используются одинаковые аргументы.

К примеру, следующий код создает кнопку с синим фоном и желтым текстом. Также устанавливается ширина и высота с показателями в 25 и 5 текстовых юнит:

import tkinter as tk

window = tk.Tk()

button = tk.Button(
text=»Нажми на меня!»,
width=25,
height=5,
bg=»blue»,
fg=»yellow»,
)

button.pack()
window.mainloop()



import tkinter as tk

 

window = tk.Tk()

 

button = tk.Button(

    text=»Нажми на меня!»,

    width=25,

    height=5,

    bg=»blue»,

    fg=»yellow»,

)

 

button.pack()

window.mainloop()

Готовая кнопка будет выглядеть следующим образом:

Неплохо! Следующие два виджета Entry и Text используются для сбора вводных данных от пользователя.

Виджет Entry — Однострочное текстовое поле

В случаях, когда требуется получить текстовую информацию от пользователя вроде адреса электронной почты, используется виджет Entry. Он отображает небольшой текстовый бокс, куда пользователь может ввести текст.

Создание виджета Entry практически ничем не отличается от процесса создания ярлыка и кнопки. К примеру, следующий код создает виджет с синим фоном и желтым текстом длиной в 50 текстовых юнит:

entry = tk.Entry(fg=»yellow», bg=»blue», width=50)



entry = tk.Entry(fg=»yellow», bg=»blue», width=50)

В случае виджета однострочного текстового поля (Entry) интересен не процесс создания стиля, а то, как получить эти входные данные от пользователя. Есть три основные операции, что можно провести с виджетом однострочного текстового поля (Entry):

  • Получение всего текста через .get()
  • Удаление текста через .delete()
  • Вставка нового текста через .insert()

Для лучшего понимания принципа работы виджетов Entry создадим один экземпляр элемента и попробуем ввести в него текст. Откройте оболочку Python и выполните следующие действия. Сначала импортируем tkinter и создаем новое окно:

>>> import tkinter as tk
>>> window = tk.Tk()



>>> import tkinter as tk

>>> window = tk.Tk()

Теперь создаем виджеты Label и Entry:

>>> label = tk.Label(text=»Имя»)
>>> entry = tk.Entry()



>>> label = tk.Label(text=»Имя»)

>>> entry = tk.Entry()

Здесь ярлык указывает, что именно пользователь должен записать в виджете Entry. Нет никаких ограничений для вводимых данных, это просто подсказка, что ввести нужно «Имя». Виджеты станут видимыми на окне после выполнения метода .pack() для каждого из них:

>>> label.pack()
>>> entry.pack()



>>> label.pack()

>>> entry.pack()

Результат выглядит следующим образом:

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

На созданном в программе виджете мы ввели текст «Иван Иванов»:

Теперь в виджете текстового поля есть текст, только он еще не был отправлен в программу. Для получения текста и присваивания его значения переменной name используется метод .get():

>>> name = entry.get()
>>> name
‘Иван Иванов’



>>> name = entry.get()

>>> name

‘Иван Иванов’

Текст также можно удалить, для этого используется метод .delete(). Данный метод принимает аргумент, который является целым числом и сообщает Python, какой символ нужно удалить. К примеру, во фрагменте кода ниже показано, как через метод .delete(0) можно удалить первый символ из текстового поля:

Теперь в виджете остался текст "ван Иванов":

Обратите внимание, что как и строки в Python, текст в виджете однострочного текстового поля индексируется,  и начинается индексирование с 0.

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

Теперь остался только текс

6 основных библиотек для программирования на Python / Хабр

Привет, Хабр! Представляю вам перевод статьи «6 Essential Python Libraries for Python Programming» автора VijayDeveloper.

Python (питон) — это высокоуровневый язык программирования общего назначения, который стал одним из ведущих и популярнейших в сообществе программистов. По своим возможностям он классифицируется от разработки упрощенных приложений до проведения сложных математических вычислений с одинаковым уровнем сложности.

Являясь одним из ведущих языков программирования, он имеет много фреймворков (платформ для построения приложений) и библиотек, которыми можно воспользоваться. Библиотека языка программирования — это просто набор модулей и функций, которые облегчают некоторые специфические операции с использованием этого языка программирования.


Итак, вот 6 основных библиотек для программирования на Python, о которых должен знать каждый разработчик на Python:

• Keras

Тип – нейросетевая библиотека.

Начальная версия – март 2015.

Keras – открытая нейросетевая библиотека, написанная на языке Python. Нацелена на оперативную работу с сетями глубокого обучения, при этом спроектирована так, чтобы быть компактной, модульной и расширяемой.

В дополнение к предоставлению более простого механизма для выражения нейронных сетей, Keras также предлагает некоторые из лучших функций для компиляции моделей, обработки наборов данных и визуализации графиков. На бэкэнде (сервере) Keras использует либо Theano, либо TensorFlow.

В связи с тем, что Keras создает вычислительный граф с помощью серверной инфраструктуры, а затем использует его для выполнения операций, он работает медленнее, чем другие библиотеки машинного обучения. Тем не менее, все модели в Keras являются портативными.

Особенности:

  • Легко отлаживать и исследовать, так как она полностью написана на Python.
  • Содержит многочисленные реализации широко применяемых строительных блоков нейронных сетей, таких как функции активации, уровни, цели и оптимизаторы.
  • Невероятная выразительность и гибкость делают его идеальным для инновационных исследований.
  • Предлагает несколько предварительно обработанных наборов данных и предварительно обученных моделей, таких как Inception, MNIST, ResNet, SqueezeNet и VGG.
  • Обеспечивает поддержку почти всех моделей нейронных сетей, включая свёрточную, встраиваемую, полностью подключенную, объединяющую в пул и рекуррентную. Более того, эти модели можно комбинировать для разработки еще более сложных моделей.
  • Работает как на CPU (центральном процессоре), так и на GPU (ядре процессора)

Область применения:

  • Уже используется Netflix, Square, Uber и Yelp.
  • Для исследования глубокого обучения. Принят исследователями в ЦЕРН и НАСА.
  • Популярный среди стартапов, разрабатывающих продукты, основанные на глубоком обучении.

• NumPy

Тип – техническая вычислительная библиотека.

Начальная версия – 1995 (как Numeric).

2006 (Как NumPy).

NumPy был создан Трэвисом Олифантом в 2005 году путем включения функций конкурирующей библиотеки Numarray в библиотеку Numeric и применения обширных модификаций. В бесплатной библиотеке с открытым исходным кодом есть несколько соавторов со всего мира.

Одна из самых популярных библиотек машинного обучения в Python, TensorFlow и несколько других библиотек используют библиотеку NumPy Python внутри себя для выполнения нескольких операций над тензорами.

Особенности:

  • Активная поддержка сообщества
  • Полностью бесплатный и открытый исходный код
  • Сложные матричные операции, такие как матричное умножение
  • Интерактивный и супер простой в использовании
  • Облегчает сложные математические реализации
  • Легко кодировать с удобочитаемыми концепциями

Область применения:

  • Для выполнения сложных математических вычислений
  • Для представления изображений, звуковых волн и других форм двоичных необработанных потоков в виде массива действительных чисел в N-мерном
  • Для проектов машинного обучения

• Pillow

Тип – Библиотека обработки изображений

Начальная версия – 1995 (Как Python Imaging Library или PIL)

2011 (Как Pillow)

Pillow — это библиотека Python, которая почти так же стара, как и язык программирования, для которого она была разработана. На самом деле, Pillow — это форк для PIL (Python Imaging Library). Свободно используемая библиотека Python необходима для открытия, манипулирования и сохранения разнообразных файлов изображений.

Pillow была принята в качестве замены оригинального PIL в нескольких дистрибутивах Linux, в частности, Debian и Ubuntu. Тем не менее, он также доступен для MacOS и Windows.

Особенности:

  • Добавляет текст к изображениям
  • Улучшение и фильтрация изображения, включая размытие, регулировку яркости, контур и резкость
  • Маскировка и прозрачность
  • Пиксельные манипуляции
  • Обеспечивает поддержку множества форматов файлов изображений, включая BMP, GIF, JPEG, PNG, PPM и TIFF. Обеспечивает поддержку для создания новых декодеров файлов с целью расширения библиотеки доступных форматов файлов.

Область применения:

  • Для обработки изображений

• PYGLET

Тип — Библиотека разработки игр

Начальная версия – апрель 2015

Библиотека многоплатформенного кадрирования и мультимедии для Python, PYGLET — это популярное имя для разработки игр с использованием Python. В дополнение к играм, библиотека разработана для создания визуально насыщенных приложений.

В дополнение к поддержке кадрирования, PYGLET обеспечивает поддержку загрузки изображений и видео, воспроизведения звуков и музыки, графики OpenGL и обработки событий пользовательского интерфейса.

Особенности:

  • Использование нескольких окон и рабочих столов с несколькими мониторами
  • Загрузка изображений, звука и видео практически во всех форматах
  • Нет внешних зависимостей и требований к установке
  • Предоставляется в соответствии с лицензией BSD с открытым исходным кодом, поэтому может свободно использоваться как в личных, так и в коммерческих целях
  • Обеспечивает поддержку как Python 2, так и Python 3

Область применения:

  • Для разработки визуально насыщенных приложений
  • Для разработки игр

• Requests

Тип – Библиотека HTTP

Начальная версия – февраль 2011

Requests — HTTP библиотека Python, направлена на то, чтобы сделать запросы HTTP проще и удобнее. Разработанный Кеннетом Рейтцем и несколькими другими участниками, Requests позволяет отправлять запросы HTTP/1.1 без вмешательства человека.

От Nike и Spotify до Amazon и Microsoft десятки крупных организаций используют запросы внутренне, чтобы лучше справляться с HTTP. Написанная полностью на Python, Requests доступна в виде бесплатной библиотеки с открытым исходным кодом под лицензией Apache2.

Особенности:

  • Автоматическое декодирование контента
  • Базовая/дайджест-аутентификация
  • Проверка SSL в браузерном стиле
  • Частичные запросы и время ожидания соединения
  • Обеспечивает поддержку прокси-серверов .netrc и HTTP (S)
  • Сеансы с сохранением cookie
  • Ответное тело Unicode

Область применения:

  • Позволяет отправлять запросы HTTP/1.1 с использованием Python и добавлять контенты, такие как заголовки, данные форм и многокомпонентные файлы
  • Для автоматического добавления строк запроса в URL
  • Для автоматического кодирования данных POST

• TensorFlow

Тип – Библиотека машинного обучения

Начальная версия – ноябрь 2015

TensorFlow — это бесплатная библиотека Python с открытым исходным кодом, предназначенная для решения ряда задач, связанных с потоком данных и дифференцируемым программированием. Тем не менее, символическая математическая библиотека TensorFlow является одной из наиболее широко используемых библиотек машинного обучения Python.

Разработанный Google Brain для внутреннего использования, библиотека используется для коммерческих и исследовательских целей.

Тензорными являются N-мерные матрицы, которые представляют данные. Библиотека TensorFlow позволяет писать новые алгоритмы, включающие большое количество тензорных операций.

Поскольку нейронные сети могут быть выражены в виде вычислительных графов, они могут быть легко реализованы с использованием библиотеки TensorFlow в виде последовательности операций над тензорами.

Особенности:

  • Позволяет визуализировать каждую часть графа
  • Полностью бесплатный и открытый исходный код
  • Легко обучается на CPU (центральный процессор) и GPU (ядро процессора) для распределенных вычислений
  • Огромная поддержка сообщества
  • Обеспечивает гибкость в своей работоспособности. Части, которые требуются больше всего, могут быть сделаны автономными
  • Поддерживает обучение нескольких нейронных сетей и нескольких графических процессоров для создания эффективных моделей в крупных системах
  • Использует методы, подобные XLA, для ускорения операций линейной алгебры

Область применения:

  • Для проектов машинного обучения
  • Для проектов нейронных сетей
  • В автоматизированном программном обеспечении для создания титров, таких как DeepDream
  • Машинное обучение в продуктах Google, таких как Google Photos и Google Voice Search

На этом завершается список 6 основных библиотек Python для программирования на Python. Какие библиотеки должны были/не должны были попасть в этот список? Дайте нам знать в ваших комментариях.

Изучайте Python сейчас и да прибудет с вами сила!

Графика в Python

Графика в Python.

С помощью графики в Python можно рисовать фигуры и изображения, создавать анимацию, визуализировать математические вычисления в Python. В программах python можно использовать элементы графики в компьютерных играх.

Для работы с графикой в Python нужно импортировать модуль graphics.py. Как установить модуль graphics в Python.

Чтобы начать работу с графикой в Python, нужно создать окно для графики
Графический объект = GraphWin(«Название окна для графики», ширина окна для графики в пикселях, высота окна для графики в пикселях)
GraphWin это ключевое слово, которое задаёт окно графической области, в котором будут отображаться графические объекты.

В качестве параметров этой функции указывается название окон для графики, ширина и высота окон в пикселях.

После запуска программы откроется окно для графики, где будут отображаться графические объекты.

Вся работа с графикой будет осуществляться нами через графические объекты.

Общая структура работы с графическими объектами в Python

Графический_объект.Вызов_команды()
Общая структура графической программы в Python.
# импортируем библиотеку graphics

from graphics import *

# создаём окно для графики

win = GraphWin(«Окно для графики», 400, 400)

# …рисуем все объекты…

win.getMouse() # ждём нажатия кнопки мыши

win.close() # закрываем окно для графики

В этой программе мы определили объект графическое окно win и открыли его с размерами 400 на 400 пикселей.

Команда win.getMouse() ожидает нажатие на любую кнопку мыши, наведённую на область окна win.
win.close() закрывает окно для графических объектов win.

С помощью модуля graphics.py в программах на Python можно отобразить точку, линию, окружность, прямоугольник, эллипс и многоугольник, вывести текст на экран.

Чтобы задать расположение объекта в графическом окне Python, необходимо указать его координаты в системе координат Python. Начало координат находится в левом верхнем углу окна для графики.

Положительное направление оси X определяется слева направо, оси Y  определяется сверху вниз. Чем больше  значение координаты X, тем правее точка, чем больше значение координаты Y, тем точка ниже. Чтобы нарисовать заданный объект obj в окне для графики win, нужно использовать процедуру obj.draw(win) 

Перед тем, как рисовать графические объекты в заданном графическом окне, нужно их задать.
Для задания точки в Python используется функция Point(x, y) 
obj = Point(x, y)

x, y – координаты точки.

Пример программы на Python, которая задаёт и отображает точку  в графическом окне.
from graphics import * # импортируем библиотеку graphics

win = GraphWin(«Окно для графики», 400, 400) # создаём окно для графики размером 400 на 400 пикселей

obj = Point(50, 50) # создаём точку в координатах (50, 50)

obj.draw(win) # отображаем точку в окне для графики

win.getMouse() # ждём нажатия кнопки мыши

win.close() # закрываем окно для графики
Для задания отрезка в Python используется функция Line(объект точка первого конца, объект точка второго конца)
obj = Line(Point(x1, y1), Point(x2, y2))

x1, y1 – координаты начала отрезка линии,

x2, y2 – координаты конца отрезка линии.

Чтобы задать цвет рисования линий в Python используется команда obj.setOutline(«цвет»)

Пример программы на Python, которая отображает линию в графическом окне.
from graphics import *

win = GraphWin(«Окно для графики», 400, 400)

obj = Line(Point(50, 50), Point(350, 350))

obj.setOutline(«blue»)

obj.draw(win)

win.getMouse()

win.close()
Для отображения окружности в Python используется
obj = Circle(Point(x, y), R)

x, y – координаты центра окружности,

R – радиус окружности.
Пример программы на Python, которая отображает окружность в графическом окне.
from graphics import *

win = GraphWin(«Окно для графики», 400, 400)

obj = Circle(Point(200, 200), 50)

obj.draw(win)

win.getMouse()

win.close()
Для отображения прямоугольника в Python используется процедура
obj = Rectangle(Point(x1, y1), Point(x2, y2))

x1, y1 – координаты левого верхнего угла прямоугольника,

x2, y2 – координаты правого нижнего угла прямоугольника
Пример программы на Python, которая отображает прямоугольник в графическом окне.
from graphics import *

win = GraphWin(«Окно для графики», 300, 300)

obj = Rectangle(Point(50, 50), Point(200, 250))

obj.draw(win)

win.getMouse()

win.close()

Для отображения эллипса в Python используется процедура
obj = Oval(Point(x1, y1), Point(x2, y2))

x1, y1 – координаты первого фокуса эллипса,

x2, y2 – координаты второго фокуса эллипса.
Пример программы на Python, которая отображает эллипс в графическом окне.
from graphics import *

win = GraphWin(«Окно для графики», 300, 300)

obj = Oval(Point(100, 100), Point(250, 200))

obj.draw(win)

win.getMouse()

win.close()

Для отображения многоугольника в Python используется процедура
obj = Polygon(Point(x1, y1), Point(x2, y2),…, Point(xn, yn))

x1, y1, x2, y2,…, xn, yn – координаты вершин многоугольника.

Пример программы на Python, которая отображает пятиугольник в графическом окне.
from graphics import *

win = GraphWin(«Окно для графики», 400, 400)

obj = Polygon(Point(10, 10), Point(300, 50), Point(200, 300), Point(150, 150), Point(70, 70))

obj.draw(win)

win.getMouse()

win.close()

 

 

Определение цвета закрашивания графического объекта в Python

Чтобы задать цвет закрашивания графического объекта в python используется команда obj.setFill(«цвет»)

Пример программы на Python, которая рисует закрашенную синюю окружность

from graphics import *

win = GraphWin(«Окно для графики», 400, 400)

obj = Circle(Point(200, 200), 50)

obj.setFill(«blue»)

obj.draw(win)

win.getMouse()

win.close()

Для редактирования границ объектов в Python используются процедуры setOutline(“цвет границы”) и
setWidth(ширина границы).
obj.setOutline(«blue») – объект obj отображается с границей синего цвета.
obj.setWidth(5) – объект obj отображается с шириной границы 5 пикселей.

По умолчанию графический объект в Python будет отображаться с границами чёрного цвета шириной 1 пиксель.
Пример программы на Python, которая отображает фигуру с синей границей и заливкой в графическом окне.
from graphics import *

win = GraphWin(«Окно для графики», 310, 310)

obj = Polygon(Point(10, 10), Point(300, 50), Point(200, 300), Point(150, 150), Point(70, 70))

obj.setOutline(«blue»)

obj.setWidth(5)

obj.setFill(«cyan»)

obj.draw(win)

win.getMouse()

win.close()

Чтобы переместить графический объект в Python, используется процедура move(dx, dy), которая перемещает объект на dx пикселей вправо и dy пикселей вниз.
obj.move(50, 50) смещает объект obj на 50 пикселей вправо и 50 пикселей вниз.

Для клонирования объектов используется процедура clone()
newObj = obj.clone()

С помощью этой команды создаётся новый графический объект newObj, который идентичен объекту obj.

Для удаления фигур с экрана используется процедура undraw() Объект удаляется с графического окна, но не удаляется из памяти.
obj.undraw()
Пример программы на Python, которая удаляет, перемещает и копирует объект в графическом окне.
from graphics import *

win = GraphWin(«Окно для графики», 400, 400)

obj = Polygon(Point(30, 10), Point(30, 50), Point(20, 30), Point(15, 30), Point(7, 7))

obj.setOutline(«blue»)

obj.setWidth(2)

obj.setFill(«cyan»)

obj.draw(win)

win.getMouse()

obj.undraw()

win.getMouse()

obj.draw(win)

obj.move(100, 100)

win.getMouse()

shape = obj.clone()

shape.move(-100, -100)

shape.draw(win)

win.getMouse()

win.close()
Для создания текста в графическом окне в Python используется команда

текстовый объект=Text(координаты точки размещения текста, “Текст”)
msg = Text(Point(50, 100), “Hello World!”) 

На экран в точке с координатами (50, 100) выведется текст со строкой Hello World!

Для изменения размера текста используется команда текстовый объект.setSize(размер текста)
msg.setSize(12)

Цвет текста изменяется с помощью метода setTextColor(цвет)
msg.setTextColor(“black”)

Текст в графическом объекте можно заменить с помощью метода setText(“Текст”)
msg.setText(“Другой текст”)

Стиль текста изменяется с помощью процедуры setStyle(стиль)
msg.setStyle(“bold”)

Стиль normal изменяет стиль текста на обычный, bold меняет стиль на полужирный, italic меняет стиль на курсив, bold italic меняет стиль текста на полужирный курсив.
Пример программы на Python, которая отображает текст в графическом окне.
from graphics import *

win = GraphWin(«Окно для графики», 400, 400)

obj = Polygon(Point(10, 10), Point(300, 50), Point(200, 300), Point(150, 150), Point(70, 70))

obj.setOutline(«blue»)

obj.setWidth(5)

obj.setFill(«cyan»)

obj.draw(win)

win.getMouse()

obj.undraw()

msg = Text(Point(200, 200), «Фигура удалилась с экрана»)

msg.setSize(12)

msg.setTextColor(«black»)

msg.setStyle(«bold italic»)

msg.draw(win)

win.getMouse()

win.close()

Вернуться к содержанию Следующая тема Графика turtle черепашка в питон

Полезно почитать по теме графика в python:
Примеры графики в Python
Анимация графики в python
Модуль графика Turtle в Python
Пример использования Turtle

Поделиться:

 

 

 

Python 3 — Программирование GUI (Tkinter)

Python предоставляет различные варианты для разработки графических пользовательских интерфейсов (GUI). Наиболее важные функции перечислены ниже.

  • Tkinter — Tkinter — это интерфейс Python для инструментария Tk GUI, поставляемый с Python. Мы бы посмотрели этот вариант в этой главе.

  • wxPython — это интерфейс Python с открытым исходным кодом для инструментария GUI wxWidgets. Вы можете найти полное руководство по WxPython здесь .

  • PyQt — это также интерфейс Python для популярной кроссплатформенной библиотеки Qt GUI. У TutorialsPoint есть очень хорошее руководство по PyQt здесь .

  • JPython — JPython — это порт Python для Java, который предоставляет сценариям Python беспрепятственный доступ к библиотекам классов Java на локальном компьютере http://www.jython.org .

Tkinter — Tkinter — это интерфейс Python для инструментария Tk GUI, поставляемый с Python. Мы бы посмотрели этот вариант в этой главе.

wxPython — это интерфейс Python с открытым исходным кодом для инструментария GUI wxWidgets. Вы можете найти полное руководство по WxPython здесь .

PyQt — это также интерфейс Python для популярной кроссплатформенной библиотеки Qt GUI. У TutorialsPoint есть очень хорошее руководство по PyQt здесь .

JPython — JPython — это порт Python для Java, который предоставляет сценариям Python беспрепятственный доступ к библиотекам классов Java на локальном компьютере http://www.jython.org .

Есть много других доступных интерфейсов, которые вы можете найти в сети.

Tkinter Программирование

Tkinter — это стандартная библиотека GUI для Python. Python в сочетании с Tkinter обеспечивает быстрый и простой способ создания приложений с графическим интерфейсом. Tkinter предоставляет мощный объектно-ориентированный интерфейс для инструментария Tk GUI.

Создание приложения с графическим интерфейсом с помощью Tkinter — простая задача. Все, что вам нужно сделать, это выполнить следующие шаги —

  • Импортируйте модуль Tkinter .

  • Создайте главное окно приложения с графическим интерфейсом.

  • Добавьте один или несколько вышеупомянутых виджетов в приложение с графическим интерфейсом.

  • Введите основной цикл событий, чтобы принять меры против каждого события, инициированного пользователем.

Импортируйте модуль Tkinter .

Создайте главное окно приложения с графическим интерфейсом.

Добавьте один или несколько вышеупомянутых виджетов в приложение с графическим интерфейсом.

Введите основной цикл событий, чтобы принять меры против каждого события, инициированного пользователем.

пример

#!/usr/bin/python3

import tkinter # note that module name has changed from Tkinter in Python 2 to tkinter in Python 3
top = tkinter.Tk()
# Code to add widgets will go here...
top.mainloop()

Это создаст следующее окно —

Ткинтер Виджеты

Tkinter предоставляет различные элементы управления, такие как кнопки, метки и текстовые поля, используемые в приложении с графическим интерфейсом. Эти элементы управления обычно называются виджетами.

В настоящее время в Tkinter существует 15 типов виджетов. Мы представляем эти виджеты, а также краткое описание в следующей таблице —

Sr.No. Оператор и описание
1 кнопка

Виджет «Кнопка» используется для отображения кнопок в вашем приложении.

2 холст

Виджет Canvas используется для рисования фигур, таких как линии, овалы, многоугольники и прямоугольники, в вашем приложении.

3 Checkbutton

Виджет Checkbutton используется для отображения ряда опций в виде флажков. Пользователь может выбрать несколько вариантов одновременно.

4 запись

Виджет «Запись» используется для отображения однострочного текстового поля для принятия значений от пользователя.

5 Рамка

Виджет Frame используется как контейнерный виджет для организации других виджетов.

6 этикетка

Виджет «Метка» используется для предоставления надписи в одну строку для других виджетов. Он также может содержать изображения.

7 Listbox

Виджет «Список» используется для предоставления пользователю списка параметров.

8 кнопку MENU

Виджет Menubutton используется для отображения меню в вашем приложении.

9 Меню

Виджет Меню используется для предоставления различных команд пользователю. Эти команды содержатся внутри Menubutton.

10 Сообщение

Виджет Сообщение используется для отображения многострочных текстовых полей для принятия значений от пользователя.

11 Переключатель

Виджет Radiobutton используется для отображения ряда параметров в качестве переключателей. Пользователь может выбрать только один вариант за один раз.

12 Масштаб

Виджет Масштаб используется для предоставления виджета слайдера.

13 Полоса прокрутки

Виджет Полоса прокрутки используется для добавления возможности прокрутки к различным виджетам, таким как списки.

14 Текст

Виджет Текст используется для отображения текста в несколько строк.

15 Верхний уровень

Виджет Toplevel используется для предоставления отдельного окна-контейнера.

16 со счётчиком

Виджет Spinbox — это вариант стандартного виджета Tkinter Entry, который можно использовать для выбора из фиксированного числа значений.

17 PanedWindow

PanedWindow — это контейнерный виджет, который может содержать любое количество панелей, расположенных горизонтально или вертикально.

18 LabelFrame

Метка — это простой контейнерный виджет. Его основная цель — выступать в качестве разделителя или контейнера для сложных оконных схем.

19 tkMessageBox

Этот модуль используется для отображения окон сообщений в ваших приложениях.

Виджет «Кнопка» используется для отображения кнопок в вашем приложении.

Виджет Canvas используется для рисования фигур, таких как линии, овалы, многоугольники и прямоугольники, в вашем приложении.

Виджет Checkbutton используется для отображения ряда опций в виде флажков. Пользователь может выбрать несколько вариантов одновременно.

Виджет «Запись» используется для отображения однострочного текстового поля для принятия значений от пользователя.

Виджет Frame используется как контейнерный виджет для организации других виджетов.

Виджет «Метка» используется для предоставления надписи в одну строку для других виджетов. Он также может содержать изображения.

Виджет «Список» используется для предоставления пользователю списка параметров.

Виджет Menubutton используется для отображения меню в вашем приложении.

Виджет Меню используется для предоставления различных команд пользователю. Эти команды содержатся внутри Menubutton.

Виджет Сообщение используется для отображения многострочных текстовых полей для принятия значений от пользователя.

Виджет Radiobutton используется для отображения ряда параметров в качестве переключателей. Пользователь может выбрать только один вариант за один раз.

Виджет Масштаб используется для предоставления виджета слайдера.

Виджет Полоса прокрутки используется для добавления возможности прокрутки к различным виджетам, таким как списки.

Виджет Текст используется для отображения текста в несколько строк.

Виджет Toplevel используется для предоставления отдельного окна-контейнера.

Виджет Spinbox — это вариант стандартного виджета Tkinter Entry, который можно использовать для выбора из фиксированного числа значений.

PanedWindow — это контейнерный виджет, который может содержать любое количество панелей, расположенных горизонтально или вертикально.

Метка — это простой контейнерный виджет. Его основная цель — выступать в качестве разделителя или контейнера для сложных оконных схем.

Этот модуль используется для отображения окон сообщений в ваших приложениях.

Стандартные атрибуты

Давайте посмотрим, как определяются некоторые из их общих атрибутов, таких как размеры, цвета и шрифты.

Размеры

Цвета

шрифты

Якоря

Рельефные стили

Bitmaps

курсоры

Управление геометрией

Все виджеты Tkinter имеют доступ к определенным методам управления геометрией, целью которых является организация виджетов по всей области родительских виджетов. Tkinter предоставляет следующие классы менеджера геометрии: pack, grid и place.

Метод pack () — этот менеджер геометрии организует виджеты в блоки перед размещением их в родительском виджете.

Метод grid () — этот менеджер геометрии организует виджеты в виде таблицы в родительском виджете.

Метод place () — этот менеджер геометрии организует виджеты, размещая их в определенной позиции в родительском виджете.

Пишем графическое приложение на Python

Вы здесь:
Главная — Python — Пишем графическое приложение на Python


В этой небольшой статье я хочу показать Вам насколько быстро можно прототипировать
графические приложения на Python. А так как Python — это язык многоцелевой, то
создание на нем графических приложений для сайтов не составляет большого труда.

Для Python существуют различные библиотеки для создания графического интерфейса пользователя,
но мы в рамках данной статьи рассмотрим самые основы только одной из них — Tkinter.
Мы создадим окно и добавим на него виджеты:




from tkinter import *

 

window = Tk()

 

window.title("GUI Приложение")

 

window.mainloop()


Теперь давайте разместим в окне метку (Label):




// window - это ссылка на окно

lbl = Label(window, text="Привет")

// размещаем метку на определенной позиции

lbl.grid(column=0, row=0)


Все вмесет это будет выглядить так:




from tkinter import *

 

window = Tk()

window.title("Привет из Приложения")

lbl = Label(window, text="Привет")

lbl.grid(column=0, row=0)

 

// запуск приложения

window.mainloop()

&nbsp;


А вот другой пример с кнопкой:




from tkinter import *

 

window = Tk()

window.title("Привет из Приложения")

// размер окна задается так
window.geometry('350x200')

 

lbl = Label(window, text="Привет")

lbl.grid(column=0, row=0)

 

// кнопка
btn = Button(window, text="Нажмите")

btn.grid(column=1, row=0)

 

window.mainloop()


Вот так просто можно создать графическое приложение в Python, не нужно устанавливать никакие библиотеки
настраивать что-либо. Просто можно импортировать библиотеку и использовать ее функциональность.


  • Создано 19.11.2019 13:56:49



  • Михаил Русаков

Предыдущая статья Следующая статья

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):


  1. Кнопка:

    <a href=»https://myrusakov.ru» target=»_blank»><img src=»https://myrusakov.ru/images/button.gif» alt=»Как создать свой сайт» /></a>

    Она выглядит вот так:


  2. Текстовая ссылка:
    <a href=»https://myrusakov.ru» target=»_blank»>Как создать свой сайт</a>

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    [URL=»https://myrusakov.ru»]Как создать свой сайт[/URL]

Интересные графические библиотеки Python для программистов на Python

Python — один из самых популярных интерпретируемых языков программирования, он разработан, чтобы подчеркнуть удобочитаемость кода и простоту синтаксиса. Сам Python обладает мощными возможностями обработки графики. И в дополнение ко многим встроенным модулям обработки графики, существует много видов стороннего программного обеспечения с открытым исходным кодом для обработки графики. В этой статье основное внимание уделяется некоторым наиболее важным графическим библиотекам Python, включая рендеринг изображений, создание диаграмм, распознавание изображений и многое другое.

1. Краски Chainer

Paints Chainer — это инструмент для раскрашивания комиксов на Python. Вам просто нужно нажать кнопку после загрузки черно-белого комического скетча, и ИИ автоматически сгенерирует для вас цветной комикс.

ДЕМО: https://paintschainer.preferred.tech/

Github: https://github.com/pfnet/PaintsChainer/wiki/Installation-Guide

2. Распознавание лиц

Face Recognition — это библиотека распознавания лиц на основе Python, которая предоставляет инструмент командной строки, позволяющий выполнять распознавание лиц на изображениях в любой папке через командную строку.

Распознавание лиц основано на dlib и имеет точность 99,38% на LFW.

Распознавание лиц можно использовать для:

  • найти все лица на картинках;
  • находит черты лица на фотографиях и манипулирует ими, а также выделяет глаза, нос, рот и подбородок каждого человека;
  • идентифицирует людей на изображениях по лицам на изображениях.
  • Эту библиотеку также можно использовать с другими библиотеками для распознавания лиц в реальном времени.

Домашняя страница проекта: https://github.com/ageitgey/face_recognition

3. Глубокая живописная гармонизация

Deep Painterly Harmonization — это библиотека синтеза изображений, основанная на Python и LUA. Библиотека представляет алгоритм, называемый двухпроходным, который может объединять небольшое изображение в основное изображение в едином стиле.

Домашняя страница проекта: https://github.com/luanfujun/deep-painterly-harmonization

4.Матплотлиб

Matplotlib — это библиотека Python, разработанная Джоном Хантером и др. для рисования 2D графики. Он использует преимущества модулей числовых вычислений Numeric и Numarray в Python и клонирует многие функции в Matlab, чтобы помочь пользователям легко получать высококачественную 2D-графику. Matplotlib может рисовать различные формы графики, включая обычные линейные графики, гистограммы, круговые диаграммы, диаграммы разброса, полосы ошибок и т.д .; он также может настраивать различные свойства графики, такие как тип, цвет, толщина линии, размер шрифта и т. д.удобно; он может хорошо поддерживать часть команд макета TeX, что может более прилично отображать математические формулы в графике. Вот много примеров.

Официальный сайт: https://matplotlib.org/

Matplotlib Учебное пособие: https://www.tutorialdocs.com/article/python-matplotlib-tutorial.html

5. PLPlot

PLPlot — это кроссплатформенный программный пакет для создания научных диаграмм. Он основан на библиотеке языка C и поддерживает различные языки (C, C ++, Fortran, Java, Python, Perl и др.)). PLPlot также является бесплатным и открытым исходным кодом.

Официальный сайт: http://plplot.sourceforge.net/

6. VPython

VPython — это модуль трехмерной графики на основе Python. VPython — это сокращение от Visual Python, а Visual — это модуль трехмерной графики Python, написанный Дэвидом Шерером, студентом Университета Карнеги-Меллона в 2000 году.

Официальный сайт: http://vpython.org/

7. Графики

Pyecharts — это библиотека классов для создания диаграмм Echarts.Echarts — это JS-библиотека визуализации данных с открытым исходным кодом от Baidu. Графика, созданная с помощью Echarts, очень наглядна, а pyecharts разработаны для взаимодействия с Python, что упрощает использование диаграмм генерации данных непосредственно в Python. Вы можете использовать диаграммы для создания автономных веб-страниц или интегрировать их во flask и django.

Официальный сайт

Pyecharts: https://github.com/pyecharts/pyecharts

Официальный сайт

Echarts: http: // echarts.baidu.com/

8. Боке

Bokeh (Bokeh.js) — это интерактивная библиотека визуализации Python, которая поддерживает современные веб-браузеры и предоставляет отличные возможности презентации. Bokeh нацелено на использование стиля D3.js для обеспечения элегантного, аккуратного и новаторского графического стиля, а также обеспечивает высокопроизводительную интерактивность с большими наборами данных. Bokeh помогает быстро и легко создавать интерактивные диаграммы, информационные панели и приложения для обработки данных.

Официальный сайт: https: // bokeh.pydata.org/en/latest/

URL-адрес Github: https://github.com/bokeh/bokeh

9. Пигал

Pygal — это библиотека Python для создания динамических диаграмм SVG. Различная графика, созданная с помощью pygal, имеет множество цветовых стилей по умолчанию, которые очень красивы.

Официальный сайт: http://pygal.org/en/stable/

URL-адрес Github: https://github.com/Kozea/pygal/

10. ImageAI

ImageAI — это библиотека распознавания изображений Python, которая предоставляет ряд хорошо обученных моделей и позволяет легко идентифицировать и маркировать различные объекты на изображении.Например, ImageAI может идентифицировать людей, облака, горы, реки и т. Д. На пейзажном изображении. ImageAI не только поддерживает распознавание изображений, но также поддерживает распознавание видео и отслеживание объектов.

URL-адрес Github: https://github.com/OlafenwaMoses/ImageAI

11. Tesseract OCR

Tesseract — это движок OCR с открытым исходным кодом, разработанный HP Labs и поддерживаемый Google. По сравнению с Microsoft Office Document Imaging (MODI), мы можем постоянно обучать его, чтобы улучшить его способность преобразовывать изображения в текст.Вы также можете использовать его в качестве шаблона для разработки механизма распознавания текста, отвечающего вашим потребностям.

URL-адрес Github: https://github.com/tesseract-ocr/tesseract

12. Подушка

PIL (Python Imaging Library) — встроенная стандартная библиотека для обработки изображений Python. Это очень мощный инструмент, но API очень прост в использовании. Pillow — это совместимая версия, созданная поверх PIL, и она не только поддерживает последнюю версию Python 3.x, но также добавляет множество новых функций, поэтому мы можем установить Pillow напрямую.

URL-адрес Github: https://github.com/python-pillow/Pillow

Мы продолжим собирать больше интересных и полезных графических библиотек Python и размещать их на этой странице. Если у вас есть лучшая графическая библиотека Python, не стесняйтесь сообщить нам об этом в комментариях.

.

Научная графика и библиотека графического интерфейса для Python

Различные возможности черчения. (взято из examples / Plotting.py)

Анализ изображений с автоматической нарезкой данных.

Трехмерная графика: объемный рендеринг, графики поверхностей, точечные графики и изоповерхности.

Различные типы ROI. Каждая область интереса выбирает данные из нижележащего изображения и повторно отображает их ниже. (взято из examples / test_ROItypes.ру)

Программируемые блок-схемы для быстрого прототипирования.

Пример использования pyqtgraph (и другие снимки экрана) см. В ACQ4

PyQtGraph

Библиотека научной графики и графического интерфейса для Python

установить из pypi:

 pip install pyqtgraph 

или через conda:

 conda install -c conda-forge pyqtgraph 

или из источника на github:

 git clone https: // github.com / pyqtgraph / pyqtgraph
                cd pyqtgraph
                установка python setup.py
                 

последние изменения — старые выпуски

PyQtGraph — это библиотека графики и графического интерфейса на чистом питоне, построенная на PyQt4 / PySide и numpy. Он предназначен для использования в математических / научных / инженерных приложениях.
Несмотря на то, что библиотека полностью написана на Python, она работает очень быстро из-за сильного использования numpy для обработки чисел и инфраструктуры Qt GraphicsView для быстрого отображения.PyQtGraph распространяется под лицензией MIT с открытым исходным кодом.

Основные характеристики:

  • Базовое 2D-построение в интерактивных окнах просмотра
    • Линейные и точечные графики
    • Данные можно панорамировать / масштабировать с помощью мыши
    • Быстрое рисование для отображения данных и взаимодействия в реальном времени
  • Отображение изображений с интерактивными справочными таблицами и контролем уровня
    • Отображает большинство типов данных (int или float; любая битовая глубина; RGB, RGBA или яркость)
    • Функции для нарезки многомерных изображений под произвольными углами (отлично подходит для данных МРТ)
    • Быстрое обновление для отображения видео или взаимодействия в реальном времени
  • Система трехмерной графики (требуется привязка Python-OpenGL)
    • Визуализация объемных данных
    • 3D-поверхности и точечные диаграммы
    • Визуализация сетки с генерацией изоповерхностей
    • Интерактивные окна просмотра вращаются / масштабируются с помощью мыши
    • Базовый 3D-график для упрощения программирования
  • Выбор / маркировка данных и контроль области интереса
    • Интерактивное обозначение вертикальных / горизонтальных местоположений и областей на графиках
    • Виджеты для выбора произвольных областей из изображений и автоматического нарезания данных для соответствия
  • Легко создавать новую графику
    • 2D-графика использует платформу Qt GraphicsView, которая является высокопроизводительной и зрелой.
    • 3D-графика с использованием OpenGL
    • Вся графика использует граф сцены для управления элементами; новые графические элементы легко создавать.
  • Библиотека виджетов и модулей, полезных для научных / инженерных приложений
    • Виджет блок-схемы для интерактивного прототипирования.
      Интерфейс аналогичен LabView (узлы соединены проводами).
    • Виджет дерева параметров для отображения / редактирования иерархии параметров
      (аналогично тем, которые используются в большинстве приложений для проектирования графического интерфейса пользователя).
    • Интерактивная консоль python с отловом исключений.
      Отлично подходит для отладки / самоанализа, а также
      расширенное взаимодействие с пользователем.
    • Управление несколькими процессами, позволяющее удаленное построение графиков, соединение сигналов Qt между процессами,
      и очень простое распараллеливание в потоке.
    • Док-система, позволяющая пользователю переставлять компоненты графического интерфейса.
      Подобен док-системе Qt, но немного более гибкий и программируемый.
    • Редактор цветового градиента
    • SpinBox с дисплеем единиц СИ и логарифмическим шагом

Установка:

PyQtGraph на самом деле не требует никаких установочных скриптов.
Все, что нужно, — это поместить папку pyqtgraph в место для импорта.
Большинство людей предпочтут просто поместить эту папку в большую папку проекта.
Если вы хотите сделать pyqtgraph доступным для всей системы, используйте один из методов, перечисленных ниже:

  • Debian, Ubuntu и аналогичные Linux:
    Загрузите.deb, ссылка на который находится в верхней части страницы.
  • Другой Linux:
    Многие люди создали пакеты для дистрибутивов Linux, не относящихся к Debian, включая Arch, Suse и Gentoo. Проверьте
    репозиторий вашего дистрибутива для пакетов pyqtgraph.
  • Windows:
    Загрузите и запустите файл установщика .exe, указанный в верхней части страницы.
  • Все (включая OSX):
    Загрузите файл.исходный код tar.gz, ссылка на который находится вверху страницы,
    извлеките его содержимое и запустите «python setup.py install» из извлеченного каталога (pyqtgraph — это чистый python
    библиотека, поэтому во время этой установки компиляция не происходит).
    Или установите из pypi, используя «pip install pyqtgraph».

Требования:

PyQtGraph, как известно, работает в Linux, Windows и OSX.
Однако он должен работать на любой платформе, которая поддерживает следующие пакеты:

  • Python 2.7 и 3+
  • PyQt 4.8+ или PySide
  • NumPy
  • привязки python-opengl необходимы для 3D-графики

Документация:

Документация размещена здесь.
Если вы хотите запросить конкретный раздел документации, спросите на
Форум.
Есть также много примеров, которые стоит просмотреть; для меню примеров выполните:

 python -m pyqtgraph.примеры 

Упаковка для распространения:

Приложения, написанные с помощью pyqtgraph, могут быть упакованы как файлы Windows exe с использованием файлов py2exe или OSX dmg.
используя py2app. Для pyqtgraph 0.9.8 и ранее прочтите этот отличный и тщательный
документ с описанием процесса. Кристиан Гэвин
Для версий, предшествующих 0.9.8, использование py2exe намного проще; см. примеры / py2exe.

Вопросы, отзывы и отчеты об ошибках:

  • Публикуйте вопросы, отзывы и отчеты об ошибках на форуме pyqtgraph.
  • Или: опубликуйте вопросы в Stack Overflow с тегом pyqtgraph
    (если он не помечен правильно, я, вероятно, никогда его не увижу).

Сравнение с другими графическими пакетами Python:

[Обратите внимание: я давно не использовал эти библиотеки; дайте мне знать, если эта информация устарела.]

.

Галерея графиков Python — Визуализация данных — с помощью Python

Добро пожаловать в галерею графиков Python. Этот веб-сайт отображает сотни диаграмм, всегда предоставляя воспроизводимый код Python! Он нацелен на демонстрацию потрясающих возможностей python для обработки данных и помочь вам извлечь из этого пользу. Не стесняйтесь предлагать диаграмму или сообщать об ошибке. Любые отзывы приветствуются. Свяжитесь с галереей, подписавшись на нее в Twitter, Facebook или подписавшись на блог. Обратите внимание, что этот онлайн-курс — еще один хороший ресурс для изучения dataviz с помощью python.

  • РАСПРЕДЕЛЕНИЕ


    СКРИПКА
    ПЛОТНОСТЬ
    BOXPLOT
    ГИСТОГРАММА

    КОРРЕЛЯЦИЯ


    РЕЙТИНГ


    ЧАСТЬ ВСЕГО


    ЭВОЛЮЦИЯ


    КАРТЫ


    карта
    Карта хороплета
    Карта подключений
    Пузырьковая карта

    ПОТОК


    Схема хорды
    Сетевая диаграмма
    Диаграмма Санки

    Прочие


    Логотип Конора Хили

    .

  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *