Создаём свое Desktop приложение на Python
LOLZTEAM
Разбираемся в основах Python на примере музыкального плеера!
Статья носит образовательный характер, мы ни к чему не призываем и не обязываем. Информация представлена исключительно в ознакомительных целях.
Больше интересных статей на нашем форуме: https://lolz.guru/articles/
Подписывайтесь на канал и делитесь ссылкой на статью с друзьями!
Всем привет! В этой статье мы напишем небольшое приложение на Python - плеер для прослушивания музыки.
Для достижения нашей цели можно использовать несколько разных и самых известных модулей:
В данной статье мы остановимся на самом популярном 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, думаю, у вас всё должно работать.

Получаем обычный установщик и запускаем его после скачки.
Для безошибочного выполнения работы следуем этой инструкции:
- При установке обязательно жмём Add Python 3.9 to PATH
- Жмём Install Now
- Не трогаем Customize Location
Установка среды программирования
Лучше не использовать блокнот или Python Idle, для такого рода проектов. Это максимально неудобно!
Поэтому я советую лучшую IDE - PyCharm. Зацикливаться на ней я не буду, в интернете полно гайдов по его установке и настройке.
Создание проекта
Заходим в PyCharm -> File -> New Project -> Заполняем имя проекта. Жмём Inherit global site-packages. Создаём проект.
Открываем cmd или терминал на вашем компьютере (если проект в PyCharm можно и терминал в PyCharm):
Вписываем pip install pyqt5 -> Вписываем pip install pyqt5-tools-> Вписываем pip install pygame.
Настройка QtDesigner
Теперь программа находится на вашем компьютере по адресу:
Путь_к_папке_где_установлен_Python\Lib\site-packages\pyqt5_tools\Qt\bin\designer.exe
или (для старых версий):
Путь_к_папке_где_установлен_Python\Lib\site-packages\pyqt5_tools\designer.exe
Если программа отсутствует (частая проблема), то можно скачать здесь.
Создайте ярлык к этой программе, поскольку использовать ее придется часто.
Работа с QtDesigner
Давайте запустим программу и посмотрим, что в ней можно сделать.

Выбираем MainWindow и жмём Create.
Теперь мы видим сетку и Widget Box слева.
Давайте разберёмся, что где находится:
- Widget Box - место, где присутствуют все виджеты
- Центральная область - место для размещения виджетов
- Object Inspector - место для просмотра всех созданных виджетов
- Property Editor - место для изменения и просмотра характеристик выбранного виджета
Накидаем начальный интерфейс. Примерно вот так:

Здесь мы видим:
- ListWidget посередине
- несколько кнопок (PushButton)
- LcdNumber для таймера
- Horizontal Slider для увеличения громкости
- PlainText сверху для названия песни
Лучше переименовывать все виджеты в удобные названия:
- Проигрывание - play
- Пауза - stop
- Добавить - add
- Удалить - delete
- Таймер - timer
- Остальное оставил как есть
Иконки подключаются к кнопке через характеристику icon у PushButton.
Все файлы в pyqt для дизайна сохраняются в ui формате.
Если вы скачали файл от меня, то надо для каждой кнопки переопределить путь к иконкам. Чтобы это сделать, откройте ui файл через designer.exe, и для каждой кнопки укажите в характеристике icon путь до картинки.
Вот мой дизайн с несколькими иконками: https://disk.yandex.ru/d/8BKxMkJ28_en2g
Работа с Pyqt5
Для начала создадим файл main.py и вставим в него полный код, который находится ниже в статье.
Мы создаём класс MyWidget и подключаем к нему файл good.ui(наш дизайн) и для каждой кнопки создаём функцию и подключаем к ней.
Названия виджетов такие же как мы их создавали, но пишутся так self.имя_виджета.
Функции
__init__
Данная функция запускается при включении приложения. Давайте посмотрим, что за что отвечает.
- uic.loadUi() - подключение дизайна к программе, у меня файл с дизайном называется good.ui
- self.playing - отвечает за проигрывание музыки, если False - музыка не играет, True - играет
- pygame.mixer.init() - подключает музыку к программе, пока что она не загружена и не включена
- подключение всех событий методом clicked.connect() в к определённым функциям
- self.lcdtimer - таймер, который каждую минуту обновляет время
lcd_timer
Данная функция - таймер который отсчитывает длительность музыки. Обновляется каждую секунду.
- self.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() ставим новое значение.
Полный код программы
import sys
import pygame
from PyQt5 import uic # Импортируем uic
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
from PyQt5.QtCore import QTimer, QTime
class MyWidget(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi('good.ui', self) # Загружаем дизайн
pygame.mixer.init()
self.playing = False
self.last_url = None
self.add_music.clicked.connect(self.addbutton)
self.delete_music.clicked.connect(self.deletebutton)
self.play.clicked.connect(self.playbutton)
self.stop.clicked.connect(self.stopbutton)
self.backward.clicked.connect(self.backwardbutton)
self.forward.clicked.connect(self.forwardbutton)
self.horizontalSlider.valueChanged.connect(self.scrolled)
self.lcdtimer = QTimer()
self.lcdtimer.timeout.connect(self.lcd_timer)
self.time_counter = 0
def lcd_timer(self):
time = QTime(self.time_counter // 3600, self.time_counter // 60, self.time_counter % 60)
text = time.toString('hh:mm:ss')
self.timer.display(text)
self.time_counter += 1
if self.time_counter == round(self.sound.get_length()):
self.time_counter = 0
self.playing = False
self.last_url = None
self.lcdtimer.stop()
def addbutton(self):
fname = QFileDialog.getOpenFileName(
self, 'Выбрать музыку', '',
'Аудио (*.mp3)')[0]
self.listWidget.addItem(fname)
def deletebutton(self):
item = self.listWidget.selectedItems()[0]
if item:
self.listWidget.takeItem(self.listWidget.row(item))
def playbutton(self):
music = self.listWidget.selectedItems()
if music:
new_url = music[0].text()
if new_url != self.last_url:
pygame.mixer.music.load(new_url)
self.last_url = new_url
pygame.mixer.music.play()
self.sound = pygame.mixer.Sound(new_url)
self.time_counter = 0
self.plainTextEdit.setPlainText(new_url)
else:
pygame.mixer.music.unpause()
self.lcdtimer.start(1000)
self.playing = True
def stopbutton(self):
if self.playing:
self.lcdtimer.stop()
pygame.mixer.music.pause()
def backwardbutton(self):
if self.playing:
if self.time_counter > 10:
pygame.mixer.music.pause()
pygame.mixer.music.set_pos(self.time_counter - 10)
self.time_counter -= 10
pygame.mixer.music.unpause()
else:
pygame.mixer.music.rewind()
self.time_counter = 0
def forwardbutton(self):
if self.playing:
if self.time_counter + 10 < self.sound.get_length():
pygame.mixer.music.pause()
pygame.mixer.music.set_pos(self.time_counter + 10)
self.time_counter += 10
pygame.mixer.music.unpause()
else:
pass
def scrolled(self):
new_value = round(self.horizontalSlider.value() / 100, 3)
pygame.mixer.music.set_volume(new_value)
if __name__ == '__main__':
pygame.init()
app = QApplication(sys.argv)
ex = MyWidget()
ex.show()
sys.exit(app.exec_())
На этом все! Учитесь новому!
