Как сделать приложение заметки на питоне
В больших приложениях загрузка начальных данных может занимать продолжительное время, в течение которого принято выводить окно-заставку, в котором отображается процесс загрузки, По окончании, заставка скрывается и отображается главное окно.
Для вывода заставки в PyQt5 предназначен класс QSplashScreen(Из модуля QtWidgets), который позволяет нам сделать заставку, он имеет вот такой формат:
<Объект> = QSplashScreen([<Изображение>][, flags=<Тип окна>[)
<Объект> = QSplashScreen(<Родитель>[, <Изображение>] [, flags=<Тип окна>])
Параметр <Родитель> позволяет указать ссылку на родительский компонент. В параметре <Изображение> указывается ссылка на изображение, которое будет отображаться на заставке. Конструктору класса QPixmap можно передать путь к фалу с изображением. Параметр flags предназначен для указание типа окна.
Класс QSplashScreen поддерживает вот такие методы:
- show() - отображает заставку;
- finish() - закрывает заставку;
- showMessage() - выводит сообшение в заставке;
- clearMessage() - удаляет надпись;
- setPixmap - Изменяет изображение;
- pixmap() - возвращает изображение виде экземпляра.
Создадим простой код, который выводит заставку:
Если запустить код, то вы увидите вот такой результат:
Тоесть мы создали код который выводит заставку с изображение, и в этой заставке с помощью showMessage() сделал простой текст, дальше с помощью AlignBottom указываем местоположение и даем ему цвет black, когда он дойдет до 100% или просто завершится, то метод finish вскроет его, и отобразится окно с кнопкой для выхода.
Мы смогли создать простую окно-заставку с изображением. Надеюсь данная статья, была полезна для вас.
Считается, что Python не лучший выбор для десктопных приложений. Однако, когда в 2016 году я собирался переходить от разработки сайтов к программному обеспечению, Google подсказал мне, что на Python можно создавать сложные современные приложения. Например blender3d, который написан на Python.
Но люди, не по своей вине используют уродливые примеры графического интерфейса, которые выглядят слишком старыми, и не понравятся молодёжи. Я надеюсь изменить это мнение в своем туториале. Давайте начнём.
Мы будем использовать PyQt (произносится «Пай-Кьют»). Это фреймворк Qt, портированный с C++. Qt известен тем, что необходим C++ разработчикам. С помощью этого фреймворка сделаны blender3d, Tableau, Telegram, Anaconda Navigator, Ipython, Jupyter Notebook, VirtualBox, VLC и другие. Мы будем использовать его вместо удручающего Tkinter.
Требования
- Вы должны знать основы Python
- Вы должны знать, как устанавливать пакеты и библиотеки с помощью pip.
- У вас должен быть установлен Python.
Установка
Вам нужно установить только PyQt. Откройте терминал и введите команду:
Мы будем использовать PyQt версии 5.15. Дождитесь окончания установки, это займёт пару минут.
Hello, World!
Создайте папку с проектом, мы назовём его helloApp. Откройте файл main.py, лучше сделать это vscode, и введите следующий код:
Этот код вызывает QGuiApplication и QQmlApplicationEngine которые используют Qml вместо QtWidget в качестве UI слоя в Qt приложении. Затем, мы присоединяем UI функцию выхода к главной функции выхода приложения. Теперь они оба закроются одновременно, когда пользователь нажмёт выход. Затем, загружаем qml файл для Qml UI. Вызов app.exec(), запускает приложение, он находится внутри sys.exit, потому что возвращает код выхода, который передается в sys.exit.
Добавьте этот код в main.qml:
Этот код создает окно, делает его видимым, с указанными размерами и заголовком. Объект Text отображается в середине окна.
PricewaterhouseCoopers , Удалённо , По итогам собеседования
Теперь давайте запустим приложение:
Вы увидите такое окно:
Обновление UI
Давайте немного обновим UI, добавим фоновое изображение и время:
Внутри типа ApplicationWindow находится содержимое окна, тип Rectangle заполняет пространство окна. Внутри него находится тип Image и другой прозрачный Rectangle который отобразится поверх изображения.
Если сейчас запустить приложение, то текст появится в левом верхнем углу. Но нам нужен левый нижний угол, поэтому используем отступы:
После запуска вы увидите следующее:
Показываем текущее время
Модуль gmtime позволяет использовать структуру со временем, а strftime даёт возможность преобразовать её в строку. Импортируем их:
Теперь мы можем получить строку с текущим временем:
Строка "%H:%M:%S" означает, что мы получим время в 24 часовом формате, с часами минутами и секундами (подробнее о strtime).
Давайте создадим property в qml файле, для хранения времени. Мы назовём его currTime.
Теперь заменим текст нашей переменной:
Теперь, передадим переменную curr_time из pyhton в qml:
Это один из способов передачи информации из Python в UI.
Запустите приложение и вы увидите текущее время.
Обновление времени
Для того чтобы обновлять время, нам нужно использовать потоки. Для этого я предлагаю использовать сигналы.
Чтобы использовать сигналы нам нужен подкласс QObject. Назовём его Backend.
У нас уже имеется свойства для строки со временем curr_time, теперь создадим свойство backend типа QtObject в файле main.qml.
Передадим данные из Python в qml:
В qml файле один объект QtObject может получать несколько функций (называемых сигналами) из Python.
Создадим тип Connections и укажем backend в его target. Теперь внутри этого типа может быть столько функций, сколько нам необходимо получить в backend.
Таким образом мы свяжем qml и сигналы из Python.
Мы используем потоки, для того чтобы обеспечить своевременное обновление UI. Создадим две функции, одну для управления потоками, а вторую для выполнения действий. Хорошая практика использовать в названии одной из функций _.
Создадим pyqtsignal и назовём его updated, затем вызовем его из функции updater.
Теперь нам осталось вызвать функцию updater. В нашем небольшом приложении, использовать отдельную функцию для вызова сигнала не обязательно. Но это рекомендуется делать в больших программах. Изменим задержку на одну десятую секунды.
Функция bootUp должна быть вызвана сразу же после загрузки UI:
Всё готово
Теперь можно запустить программу. Время будет обновляться корректно. Для того, чтобы убрать рамку, вы можете добавить в qml файл следующую строку:
Так должен выглядеть файл main.py:
Вот содержимое файла main.qml:
Сборка приложения
Для сборки десктопного приложения на Python нам понадобится pyinstaller.
Чтобы в сборку добавились все необходимые ресурсы, создадим файл spec:
Настройки файла spec
Параметр datas можно использовать для того, чтобы включить файл в приложение. Это список кортежей, каждый из которых обязательно должен иметь target path(откуда брать файлы) и destination path(где будет находится приложение). destination path должен быть относительным. Чтобы расположить все ресурсы в одной папке с exe-файлами используйте пустую строку.
Измените параметр datas, на путь к вашей папке с UI:
Параметр console установим в false, потому что у нас не консольное приложение.
Параметр name внутри вызова Exe, это имя исполняемого файла. name внутри вызова Collect, это имя папки в которой появится готовое приложение. Имена создаются на основании файла для которого мы создали spec — main.py.
Теперь можно запустить сборку:
В папке dist появится папка main. Для запуска программы достаточно запустить файл main.exe.
Так будет выглядеть содержимое папки с десктопным приложением на Python:
О том, как использовать Qt Designer для создания UI приложений на Python читайте в нашей статье.
Алгоритм
Программа будет очень простой:
- Спросить пользователя, о чем он хочет сделать напоминание.
- Спросить, когда (через какое время, в минутах)
- Рассчитать время ожидания (минуты умножить на секунды)
- Ожидать указанное время
- Напомнить о том, что пользователь запросил на шаге 1
Реализация
Шаг 0: Настройка параметров
Теперь нам нужно спросить пользователя и получить ответ. В идеале нам нужен будет вот такой код:
Но так как сейчас нам нужна простая реализация, мы прибегнем к некоторым встроенным командам:
Это означает: взять все, что написал пользователь, интерпретировать это как текст и поместить в память под именем text . Функция input() читает все, что вводит пользователь. Функция str() преобразует в текст все, что было введено. Знак равенства означает «положить одну вещь в память под таким именем».
Шаг 2: Запрос времени
Далее нам нужно время в минутах. Вот оно:
Вторая строка означает: взять то, что набрал пользователь, интерпретировать это как число и поместить в память под именем local_time .
Шаг 3. Подсчет времени ожидания
У нас есть количество минут, в течение которых наше приложение будет ждать, прежде чем напомнить нам. Но метод Python time.sleep() требует секунд, а не минут. Поэтому теперь нам нужно преобразовать минуты в секунды:
Это означает: взять все, что находится в памяти под именем local_time , умножить это на 60 и поместить в память под тем же именем.
Шаг 4. Ожидание
Теперь нам понадобится модуль времени, который мы загрузили на 0 шаге:
Это следует читать так: из модуля time взять метод sleep . В памяти найти фрагмент данных под названием local_time . Обработать эту часть данных с помощью sleep и предоставить нам возможность наблюдать за результатом. Что же произойдет? У нас есть количество секунд в local_time . Мы даем это значение на обработку в sleep , и программа “спит” в течение указанного количества секунд. Мы знаем, что она спит, потому что уже прочитали справочное руководство для модуля time.
Шаг 5. Напоминание
Помните, что текст нашего напоминания хранится в памяти под именем text ? Настало время его использовать:
Окончательный код
Вот тот окончательный код, который будет у нас работать:
Если вы введете его в свой блокнот Jupyter и запустите (Shift + Enter), то увидите свою программу в действии:
А если вы хотите еще больше попрактиковаться в Python, то можете попробовать бесплатный курс Practicum by Yandex.
Статья носит образовательный характер, мы ни к чему не призываем и не обязываем. Информация представлена исключительно в ознакомительных целях.
Для достижения нашей цели можно использовать несколько разных и самых известных модулей:
В данной статье мы остановимся на самом популярном PyQt.
PyQt содержит не только удобные методы для создания приложений, но и инструменты для их дизайна - Qt Designer, что не предоставляет ни один другой модуль. PyQt доступен для Windows, MacOSX, Linux, Android iOS и Raspberry Pi и различных версий Python от v2 до Qt v5.
Также мы будем использовать модуль pygame для манипуляций с музыкой.
Установка Python
Изначально нам нужно установить сам язык программирования Python. Переходим на официальный сайт языка Python. Нажимаем на вкладку Downloads. Далее на кнопку Download Python 3.9.5. У меня стоит Python 3.9, думаю, у вас всё должно работать.
[IMG]
Получаем обычный установщик и запускаем его после скачки.
Для безошибочного выполнения работы следуем этой инструкции:
- При установке обязательно жмём Add Python 3.9 to PATH
- Жмём Install Now
- Не трогаем Customize Location
Установка среды программирования
Поэтому я советую лучшую IDE - PyCharm. Зацикливаться на ней я не буду, в интернете полно гайдов по его установке и настройке.
Создание проекта
Заходим в PyCharm -> File -> New Project -> Заполняем имя проекта. Жмём Inherit global site-packages. Создаём проект.
Открываем cmd или терминал на вашем компьютере (если проект в PyCharm можно и терминал в PyCharm):
Вписываем pip install pyqt5 -> Вписываем pip install pyqt5-tools-> Вписываем pip install pygame.
Настройка QtDesigner
Теперь программа находится на вашем компьютере по адресу:
или (для старых версий):
Если программа отсутствует (частая проблема), то можно скачать здесь.
Создайте ярлык к этой программе, поскольку использовать ее придется часто.
Работа с QtDesigner
Давайте запустим программу и посмотрим, что в ней можно сделать.
[IMG]
Выбираем MainWindow и жмём Create.
Теперь мы видим сетку и Widget Box слева.
Давайте разберёмся, что где находится:
- Widget Box - место, где присутствуют все виджеты
- Центральная область - место для размещения виджетов
- Object Inspector - место для просмотра всех созданных виджетов
- Property Editor - место для изменения и просмотра характеристик выбранного виджета
Накидаем начальный интерфейс. Примерно вот так:
[IMG]
- ListWidget посередине
- несколько кнопок (PushButton)
- LcdNumber для таймера
- Horizontal Slider для увеличения громкости
- PlainText сверху для названия песни
Лучше переименовывать все виджеты в удобные названия:
Иконки подключаются к кнопке через характеристику icon у PushButton.
Все файлы в pyqt для дизайна сохраняются в ui формате.
Если вы скачали файл от меня, то надо для каждой кнопки переопределить путь к иконкам. Чтобы это сделать, откройте ui файл через designer.exe, и для каждой кнопки укажите в характеристике icon путь до картинки.
Работа с Pyqt5
Для начала создадим файл main.py и вставим в него полный код, который находится ниже в статье.
Мы создаём класс MyWidget и подключаем к нему файл good.ui(наш дизайн) и для каждой кнопки создаём функцию и подключаем к ней.
Названия виджетов такие же как мы их создавали, но пишутся так self.имя_виджета.
Функции
__init__
Данная функция запускается при включении приложения. Давайте посмотрим, что за что отвечает.
-
() - подключение дизайна к программе, у меня файл с дизайном называется good.ui - отвечает за проигрывание музыки, если False - музыка не играет, True - играет () - подключает музыку к программе, пока что она не загружена и не включена
- подключение всех событий методом clicked.connect() в к определённым функциям - таймер, который каждую минуту обновляет время
lcd_timer
Данная функция - таймер который отсчитывает длительность музыки. Обновляется каждую секунду.
-
- объект QLcdNumber (дисплей). Методом display() выводится время.
- далее идёт условие, проверяющее длительность музыки на совпадение с таймером.
add_button
Данная функция добавляет выбранный музыкальный файл, используя QFileDialog. Затем добавляет в таблицу методом addItem().
delete_button
Данная функция удаляет выбранный музыкальный файл методом takeItem().
playbutton
Данная функция отвечает за кнопку проигрывания. При нажатии берётся выбранный элемент методом selectedItems()
Сравнивается не изменил ли музыку пользователь. Если изменил, то мы проигрываем заново методом load(), обновляем счётчик.
Если не изменил, то музыку уходит с паузы, если была остановлена, методом unpause()
stopbutton
Данная функция отвечает за кнопку паузы. Если музыка играет (за это отвечает self.playing), таймер останавливается, музыка останавливается методом pause().
backwardbutton
Данная функция отвечает за кнопку отматывания назад на 10 секунд. Если музыка идёт дольше 10 секунд, то методом set_pos() устанавливаем позицию self.time_counter - 10 (эквивалентно времени 10 секунд назад).
forwardbutton
Данная функция отвечает за кнопку отматывания вперёд на 10 секунд. Всё аналогично прошлой функции.
scrolled
Данная функция отвечает за событие изменения звука. Методом value() получаем новое значение звука. Методом set_value() ставим новое значение.
Читайте также: