简体   繁体   English

Python pygame在音乐播放期间冻结

[英]Python pygame freezes during music playing

Hello I am building a simple mp3 player. 您好,我正在构建一个简单的mp3播放器。 I have it now so it plays a sound fine when I enable the function, but the gui temporarily freezes while waiting for the sound file to finish. 我现在有了它,因此在启用该功能时它可以正常播放,但是gui在等待声音文件完成时会暂时冻结。 I would like to be able to hit stop, exit, etc while the file plays. 我希望能够在播放文件时点击停止,退出等。 Any advice? 有什么建议吗?

def Play():
    soundfile = 'test.wav'
    pygame.mixer.music.load(soundfile)
    pygame.mixer.music.play(0)
    events = pygame.event.get()
    while pygame.mixer.music.get_busy():

        for event in events:

            if event.type == pygame.QUIT:
                sys.exit()

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.Q:
                    sys.exit()
            elif event.type == pygame.MOUSEMOTION:
                 print "mouse at (%d, %d)" % event.pos

When pygame.event.get() is not being called, the game window will freeze. 当不调用pygame.event.get()时,游戏窗口将冻结。 Since you're calling pygame.event.get() outside of your while loop, the window event queue is only getting flushed once. 由于您在while循环之外调用pygame.event.get(),因此窗口事件队列仅刷新一次。 The simple solution is to just replace the events variable with pygame.event.get() directly inline so that it gets called continuously while get_busy() returns true. 一种简单的解决方案是直接将内联事件变量替换为pygame.event.get(),以便在get_busy()返回true时连续调用该变量。

In general for these situations, a better solution would be a little refactoring where you have pygame.event.get() called once centrally in your program and instead of calling a function called Play() that handles managing your event queue, you instead have a function called handlePlayForOneFrame(list_of_relevant_events_this_frame). 通常,对于这些情况,更好的解决方案是稍微重构一下,您可以在程序中集中调用一次pygame.event.get(),而不是调用处理事件队列的Play()函数,一个名为handlePlayForOneFrame(list_of_relevant_events_this_frame)的函数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM