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