Воспроизведение многопоточной музыки с Pygame в терминале

Я пытаюсь создать текстовую игру и добавить к ней немного музыки и, возможно, звуков, однако ответ «Большой и величайший» был Pygame. После тестирования я обнаружил, что когда вы используете ЛЮБУЮ функцию Pygame, она останавливает текущий сеанс терминала от вывода каких-либо дополнительных результатов, это останавливает продолжение игры.

Я сначала попробовал обычный ...

from pygame import *
def some_function():
    mixer.load("music.mp3")
    mixer.music.play(0)

    clock = time.Clock()
    clock.tick(10)
    while mixer.music.get_busy():
        clock.tick(10)
    Rest_of_function

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

from file_with_music import * #added threading to this file

def main():
    file_with_music.start()
    Rest_of_Function

Однако это не сработало, поскольку раздражающее всплывающее окно «Добро пожаловать в pygame» снова заблокировало вывод терминала ...

Итак, следующим шагом было создание нового файла и ...

from Main import *
from Intro_Sounds import *

if __name__ == '__main__':
    Intro_Thread.start() #Intro did not start because pygame popup was somehow called
    Music_Thread.start()

Даже после помещения их обоих в потоки это все равно не сработало ...

В качестве примечания, в Main есть функция, которая предназначена для выполнения

Music_Thread.join()
Music_Thread.stop()

После того, как определенный ввод будет выполнен.

Ожидаемый результат - это воспроизведение музыки в фоновом режиме, в то время как терминал продолжает распечатывать ввод и принимать ввод до тех пор, пока не будет введен ввод, который уничтожит поток Music. Конечно, не вышло, и я в недоумении ...

Как можно проигрывать музыку без зависания терминала.


person Promus Aster    schedule 06.01.2019    source источник


Ответы (3)


У pygame.mixer, к сожалению, нет такой возможности (насколько я знаю). Вместо этого используйте winsound:

import winsound  # only on windows tho...
winsound.PlaySound('sound.wav', winsound.SND_ASYNC)  # this will play the sound and...
print('I can still print :D')                        # this can still print :D
person GeeTransit    schedule 06.01.2019
comment
Наверное, нет ... Поищу альтернативу. - person GeeTransit; 07.01.2019
comment
Я тоже попробую - person Promus Aster; 08.01.2019
comment
wxPython казался многообещающим, однако в нем отсутствует вся полезная документация, и они удалили все звуковые модули из вида импорта .... - person Promus Aster; 10.01.2019

Попробовав несколько вещей, я обнаружил ...

Pygame не поддерживает звук и вывод на терминал, поэтому работать не будет.

WxPython больше не имеет функционального звукового модуля, что делает его бесполезным.

Другие проекты заброшены или зависят от ОС ...

Однако я обнаружил, что PyOpenAL действительно работает, хотя он не может понимать файлы mp3 или 32-битный плавающий wav. Вместо использования многопоточности я переключился на многопроцессорность (создав сценарий из 2000 строк, чтобы правильно изучить, как работает модуль), и теперь звук воспроизводится (и зацикливается), разрешая вывод на терминал.

TL:DR

PyOpenAL - победитель.

person Promus Aster    schedule 23.01.2019

пожалуйста, попробуйте следующее -

from pygame import *
def some_function():
    pygame.mixer.music.load("music.mp3")
    pygame.mixer.music.play(0)
    clock = time.Clock()
    clock.tick(10)
    while pygame.mixer.music.get_busy():
        clock.tick(10)
    Rest_of_function
person Piyush Kumar    schedule 06.01.2020