Создание настольных Python приложений с графическим интерфейсом пользователя - Тимур Машнин
Шрифт:
Интервал:
Закладка:
Поэтому для начала установим библиотеку fbs.
Далее мы в терминале запускаем команду fbs startproject.
В результате выполнения которой будет создана папка src/main/python/с файлом main.py.
Команда startproject создает необходимую структуру папок для приложения fbs.
Если мы наберем в терминале команду fbs run, откроется просто пустое окно.
Теперь, как нам вставить в это окно нашу метку.
Здесь вы можете заметить, что создание приложения с помощью fbs представляет новую концепцию — ApplicationContext.
При создании приложений PyQt5 обычно используется ряд компонентов или ресурсов, которые используются во всем приложении.
И ApplicationContext предоставляет центральное место для инициализации и хранения этих компонентов, а также предоставляет доступ к некоторым основным функциям fbs.
Объект ApplicationContext также создает и содержит ссылку на глобальный объект QApplication, доступный в ApplicationContext.app, так как каждое приложение Qt должно иметь один и только один объект QApplication для хранения цикла событий и основных настроек.
Теперь, чтобы вставить нашу метку, помимо QMainWindow импортируем метку.
Создадим метку и методом setAlignment установим ее посередине.
Методом setCentralWidget добавим метку в окно QMainWindow.
В результате после вызова команды fbs run мы увидим окно с меткой.
Более подробно про окно QMainWindow можно посмотреть в
QT
документации.
Теперь, приложениям обычно требуются дополнительные файлы данных помимо исходного кода — например, изображения.
И вот здесь может быть полезен ApplicationContext.
Вы можете поместить ресурсы приложения в папку resources, и чтобы упростить загрузку ресурсов из папки resources, fbs предоставляет метод ApplicationContext.get_resource.
Этот метод принимает имя файла, который можно найти в папке resources, и возвращает абсолютный путь к этому файлу.
И вы можете использовать этот возвращенный абсолютный путь, чтобы открыть файл.
Папка resources должна содержать папку base плюс любую комбинацию других папок.
Базовая папка содержит файлы, общие для всех операционных систем, в то время как папки для конкретных платформ могут использоваться для файлов, специфичных для данной ОС.
Теперь, далее мы можем использовать fbs, чтобы превратить файл питона в отдельный исполняемый файл.
Для этого в терминале наберем команду fbs freeze.
Эта команда помещает исполняемый двоичный файл в целевую папку текущего каталога.
Далее мы можем создать установщик приложения.
Но для начала мы должны установить NSIS — систему с открытым исходным кодом для создания установщиков Windows.
Также нужно добавить каталог NSIS в переменную среды
Windows
PATH.
После этого нужно перезапустить среду разработки PyCharm, чтобы она увидела эти изменения.
Далее создадим установщик с помощью команды fbs installer.
Эта команда помещает исполняемый двоичный файл в целевую папку текущего каталога.
Теперь вы можете отправлять его для установки приложения.
Виджеты и компоновки PyQt
Система компоновки Qt предоставляет простой и мощный способ организации дочерних виджетов внутри родительского виджета.
Qt предоставляет набор классов управления компоновкой.
Эти компоновки автоматически позиционируют и изменяют размер виджетов.
И все виджеты Qt могут использовать компоновки для управления своими дочерними элементами с помощью функции setLayout.
Здесь мы с помощью компоновки QHBoxLayout располагаем метки горизонтально в окне QWidget.
Компоновка QVBoxLayout размещает метки вертикально.
Компоновка QGridLayout располагает элементы в сетке.
При этом для каждого элемента можно указать строку, столбец, в которых должен находиться элемент.
Также можно указать затем сколько строк и столбцов должен заполнять элемент.
Компоновка QFormLayout добавляет два виджета в строку, обычно QLabel и QLineEdit для создания форм.
В качестве резюме — виджеты могут иметь в качестве родительских только другие виджеты, но не компоновки.
Но вы можете вкладывать компоновки в родительскую компоновку с помощью метода addLayout, тогда внутренний макет становится дочерним по отношению к макету, в который он вставлен.
Теперь, модуль Qt Widgets предоставляет набор элементов пользовательского интерфейса для создания пользовательских интерфейсов приложения.
И все, что вы видите в приложении PyQt, представляет собой виджеты: кнопки, метки, окна, диалоговые окна, индикаторы выполнения и т. д.
С меткой мы уже познакомились.
При создании метки, передавая в конструктор в качестве параметра объект окна, мы сообщаем, что метка является частью окна.
Метки имеют размер по умолчанию, и для длинных строк текста размер по умолчанию может быть слишком мал.
К счастью, у нас есть метод adjustSize, который автоматически настраивает размер метки.
В противном случае длинный текст будет отображаться на экране только частично.
И метод move определяет начальную позицию метки от левого верхнего угла экрана.
Каждому графическому интерфейсу нужен какой-нибудь способ получения ввода от пользователя.
В PyQt такой способ ввода данных — это использование виджета QLineEdit.
Или если вы хотите получить ввод многострочного текста, вам нужно использовать виджет QTextEdit.
И конечно ввод как правило используется вместе с кнопкой QPushButton.
Чтобы получить введенный текст из виджета QLineEdit, вы должны использовать метод text.
Здесь мы создаем кнопку Submit, которая вызывает функцию show, использующую метод text виджета QLineEdit.
Мы также создаем кнопку Clear, которая вызывает метод clear виджета QLineEdit, который удаляет все его содержимое.
Метод SetEchoMode принимает несколько различных «режимов», одним из которых является режим пароля, который скрывает ввод.
Используя метод setFixedWidth, мы можем установить размер виджета QLineEdit в пикселях.
Значение по умолчанию для каждого виджета составляет около 100 пикселей.
Теперь о кнопке QPushButton.
Как следует из названия, это кнопка, которая запускает функцию при нажатии.
Кнопка, которая не связана с функцией, бесполезна.
Кнопки предназначены для подключения функции, которая будет выполняться после нажатия кнопки.
И такая функция подключается с помощью метода clicked.connect.
Также вы можете установить изображение на кнопку, с помощью виджета QIcon.
Просто передайте в него путь к файлу, и все готово.