在终端中使用Pygame播放多线程音乐

时间:2019-01-06 22:32:37

标签: python-3.x multithreading pygame

我正在尝试制作文本游戏并向其中添加一些音乐,也许听起来也是如此,但是,“最大最伟大”的答案是Pygame。经过测试,我发现当您使用ANY 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

但是,这不起作用,因为令人讨厌的“ Welcome to 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线程的输入为止。当然,它不起作用,我茫然不知所措...

如何在不冻结终端的情况下播放音乐。

3 个答案:

答案 0 :(得分:0)

可悲的是,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

答案 1 :(得分:0)

尝试了几件事后,我发现...

Pygame对声音和终端输出不友好,因此无法正常工作。

WxPython不再具有功能正常的声音模块,从而使其失去作用。

其他项目被放弃或特定于操作系统...

但是,我发现PyOpenAL确实可以工作,尽管它无法理解mp3文件或32位float wav。我不再使用多线程,而是切换到多处理(制作2000行脚本来正确学习模块的工作原理),现在声音在播放(和循环)同时允许终端输出。

TL:DR

PyOpenAL是赢家。

答案 2 :(得分:0)

请尝试以下操作-

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