Создаём свое Desktop приложение на Python

Создаём свое 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, думаю, у вас всё должно работать.

[​IMG]

Получаем обычный установщик и запускаем его после скачки.

Для безошибочного выполнения работы следуем этой инструкции:
  • При установке обязательно жмём 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

Давайте запустим программу и посмотрим, что в ней можно сделать.

[​IMG]

Выбираем MainWindow и жмём Create.

Теперь мы видим сетку и Widget Box слева.

Давайте разберёмся, что где находится:

  • Widget Box - место, где присутствуют все виджеты
  • Центральная область - место для размещения виджетов
  • Object Inspector - место для просмотра всех созданных виджетов
  • Property Editor - место для изменения и просмотра характеристик выбранного виджета

Накидаем начальный интерфейс. Примерно вот так:

[​IMG]

Здесь мы видим:

  • 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_())

На этом все! Учитесь новому!


Report Page