Плеер на pygame

в 14:17, , рубрики: pygame, python, Песочница, метки: ,

Hello world, %Username%. Я заметил, что в последнее на Хабре время достаточно много постов про python. Да, язык набирает популярность. Ура товарищи! Вот и я решил приобщиться к этому языку. Достаточо скоро надоело хэлловорлдить и захотелось мне написать что то нужное.Лирическое отстпуление: Перешел с win на ubuntu(Знаю, что попса, но ради дела, а не понта делается) и понял, что нет приемлимого аудиопроигрывателя в моем поле зрения, все проигрыватели предлагали либо выглядели не приятно, либо были слишком тяжелыми. Немного поленившись я взялся за дело.

Уже в самом начале написания скрипта встал перед выбором. Использовать pyqt и библиотеку для работы со звуком, либо использовать pygame. Выбрал второе, об этом очень пожалел. Процесс начался. Полный код выкладывать сюда не буду, он ждет вас по ссылке
Однако в связи с ужаснейшей привычкой не комментировать код я выделю здесь основные моменты работы с pygame.

Концепция заключается в том, что в программе существует главный цикл, в котором идет обработка информации и изменение условно говоря Картинки на экране.

while running:

pygame.display.init()
pygame.font.init()
pygame.mixer.init(frequency=44100, size=-16, channels=2, buffer=4096)

Инициализация используемых модулей.
Вообще по идее можно было все это заменить на pygame.init(), но так выглядит солиднее, да и внутренний параноик будет немного меньше беспокоиться о быстродействии. Так же нужно разъяснить последнюю строчку
frequency=44100 — Частота дискретизации звука, по умолчанию 22050(Звук ужасный)
size = -16 — Страшная магия вуду, буду благодарен, если кто-то разъяснит для чего нужен этот параметр.
channels = 2 — Указываем количество каналов для воспроизведения
buffer=4096 — Размер буфера

pygame.mixer.music.set_volume(self.logic.volume)
Указываем громкость воспроизведения. Важно, стоит помнить, что этим методом указывается громкость всей программы, а не отдельных файлов.

self.screen = pygame.display.set_mode((600,230))

Этот метод создает главное окно и главный Surface. Как вы уже догадались он принимает как аргумент — разрешение будущего окна.

pygame.display.set_caption(u"Ktulhu fhtang")

Указание заголовка главного окна.

self.ui = pygame.font.Font("Arial.ttf",32)

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

self.ui.render(u"Play",True,(0,0,0))

С помощью этого метода отрисовывается полученный первым аргументом текст. Второй аргумент — Сглаживание текста. Третьим аргументом принимается значения цвета в формате (r,g,b). Сразу стоит отметить, что pygame может отрисовывать unicode, если поставить волшебную букву u""

self.screen.fill((255,255,255))

Закрашивает экран указаным цветом, вообще не только экран, а любой Surface, примитивы в том числе.

self.screen.blit(self.play,(0,0))

Крайне важный метод blit, он принимает 2 аргумента. 1 — Любой Surface объект, 2 — Координаты в которых нужно отрисовать слой. Что же делает это метод? Он Присоединяет принимаемый surface к surface к которому он применяется. В данном случае self.play присоединяется к основному surface.

event = pygame.event.poll()

Сохраняем в переменную все события собранные за один прогон цикла.

pygame.display.flip()

Метод обновляющий изображение на экране. Без него вы не увидите ничего кроме черного экрана

pygame.time.wait(25)

В связи с тем, что python не слишком быстрый язык высокой количество fps сильно нагружает даже мощные компьютеры, поэтому каждый прогон цикла я заставляю ждать 25 миллисекунд. FPS не замерял, но процессор не нагружается, а скорости отрисовки хватает.

Почему же я пожалел, что выбрал pygame? Вся проблема в том, что при попытке воспроизведения mp3 файлов с тегами версии 3(а таких уже очень много) pygame виснет и это крайне не приятно. Единственным выходом является смена библиотеки, не знаю когда сей баг пофиксят.

rghost.ru/38700690 — Вот Франкинштейн описаный в статье выше.

Знаю код не претендует на звание самого логичного и хорошо оформленного, но все же прошу не пинать

Автор: danial72

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js