Разработчики Python могут создавать кроссплатформенные графические пользовательские интерфейсы (GUI) в 2020 году, используя PyQt5 framework! Это руководство будет содержать несколько примеров кода Python, а также инструкции для быстрого создания графического интерфейса пользователя с помощью программы Qt Designer. Вы можете импортировать сгенерированные файлы построителя графического интерфейса в свой код Python, чтобы ускорить время разработки. Давайте начнем!

Что такое PyQt GUI Framework?

PyQt - это версия Python Qt Framework. Qt - это фреймворк с открытым исходным кодом, написанный на C ++. Он используется для простого создания графического интерфейса пользователя с виджетами, которые являются обычным явлением в настольных приложениях. Разработчик может быстро программно создавать кнопки, изображения, ярлыки и другие компоненты пользовательского интерфейса рабочего стола с помощью ООП-дизайна.

С помощью Qt разработчики могут быстро создавать пользовательские интерфейсы, которые работают в MacOS, Windows, Linux, Android и некоторых встроенных системах. Благодаря PyQt разработчики могут писать свои приложения полностью на Python вместо C ++.

Есть документация для Qt, а также PyQt5. Оба из них были очень полезны при написании этого руководства. Кроме того, особенно полезными оказались Репозиторий примеров PyQt5 и Книга PyQt5 Майкла Херманна.

Qt Designer - Инструмент Python GUI Builder

Прежде чем мы перейдем к написанию кода Python для создания настольного приложения, давайте взглянем на приложение Qt Designer.

Qt Designer можно использовать для быстрого создания пользовательских интерфейсов с последующим их экспортом как .ui файлы. Эти файлы пользовательского интерфейса представляют собой XML-представления вашего графического интерфейса пользователя, которые, в свою очередь, могут быть импортированы в программу Python. Пример импорта предварительно созданного файла пользовательского интерфейса в программу Python можно найти в репозитории PyQt5 examples на GitHub.

Пример программирования графического интерфейса пользователя Python

Сегодня мы собираемся создать приложение для просмотра фотоальбомов для ПК с использованием Python и PyQt. Загляните в мой репозиторий GitHub, чтобы получить полный исходный код приложения Python Photo Album Desktop. Вся программа - это всего 160 строк кода Python!

Файловая структура настольного приложения Python

Наше приложение для просмотра фотоальбомов имеет очень простую файловую структуру. Есть файл с именем app.py, в который мы будем писать весь наш код Python. Также есть 1 папка с именем my-album, куда мы будем помещать все файлы изображений, которые хотим просмотреть в настольном приложении.

В будущем мы сможем создать пользовательский интерфейс подсказок, который позволит пользователю выбирать конкретную папку для просмотра изображений. На данный момент наше приложение будет иметь доступ только к фотографиям в папке my-album.

Зависимости приложений Python

Для создания этого настольного приложения Python требуется только одна зависимость. Вы можете установить PyQt5 с помощью pip.

pip install PyQt5

Теперь, когда у нас настроена папка и установлена ​​зависимость, мы можем приступить к написанию кода Python.

Импорт приложений Python

Нам нужно будет импортировать некоторые части PyQt. Нам также необходимо импортировать os библиотеку Python, чтобы импортировать файлы изображений из папки изображений хост-компьютера.

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

Классы пользовательских виджетов PyQt

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

Другой виджет будет для отображения изображения. Изображение должно расшириться до полного размера отведенного пространства в окне, даже если пользователь изменит размер окна. Оба класса унаследуют класс QWidget.

Виджет для отображения изображения

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

Нам нужно создать экземпляры двух виджетов Qt, метки и растрового изображения. Растровое изображение содержит данные изображения, а метка - растровое изображение. У нас есть 2 метода в объекте.

Метод update_display_image используется для изменения отображаемого изображения всякий раз, когда пользователь щелкает другой эскиз в виджете навигации.

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

Виджет для отображения эскизов фотоальбома

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

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

Конструктор создает экземпляр макета Qt. Qt имеет несколько типов компоновки. Затем конструктор создает миниатюру каждого файла изображения внутри папки альбома. Опять же, есть растровое изображение и метка для каждого миниатюрного изображения. Под изображением есть текстовая метка, в которой указано имя файла изображения.

После того, как все миниатюры изображений добавлены в макет, объект автоматически выбирает первое изображение в коллекции с помощью метода on_thumbnail_click.

Метод on_thumbnail_click будет выполняться всякий раз, когда пользователь нажимает на миниатюру. Он отменяет выбор всех изображений в пользовательском интерфейсе навигации и выбирает 1 эскиз, по которому щелкнул пользователь.

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

Создание главного окна рабочего стола

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

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

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

Наш метод on_main_window_resize обращается к экземпляру виджета отображаемого изображения, чтобы обновить его размер. Таким образом, отображаемое изображение всегда будет заполнять все пространство в главном окне, даже когда пользователь изменяет размер окна.

Последний бит кода в app.py инициализирует объект приложения PyQt, который создает главное окно.

Попробуйте запустить app.py из командной строки. Перейдите в папку своего проекта и запустите команду.

python app.py

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

Создавать настольные приложения с помощью Python легко благодаря графическому интерфейсу PyQt! Обязательно ознакомьтесь с репозиторием GitHub с примерами кода, указанным выше, для получения более подробных примеров PyQt. Также посмотрите мой Пример приложения Python ChatBot, если вам нравится Python.