如何在播放歌曲后让pygame停止?

4
我可以帮助您翻译,这段内容是关于编程的。您需要使用这个 tutorial 来运行pygame而不是在脚本中使用Mplayer。
因此,在代码中:
import pygame     
pygame.init()
song = pygame.mixer.Sound(my_song.ogg)
clock = pygame.time.Clock()
song.play()
while True:
   clock.tick(60)
pygame.quit()
print "done"   # not appears
exit()

歌曲播放得很好,但控制台从未打印“完成”。程序停留在循环中...如何修复? 谢谢
编辑:我找到了这个,它可以很好地工作,有一首10秒的歌曲:
import pygame
import time     
pygame.init()
song = pygame.mixer.Sound(son)
clock = pygame.time.Clock()
song.play()
while True:
  clock.tick(60)
  time.sleep(10)
  break
pygame.quit()
print "done"
exit()

1
"while True" 是一个无限循环。你期望它做什么? - Eric Finn
我想让程序播放 .ogg 音频文件,并在播放完毕后打印“done”(或其他内容),例如使用 exit() 函数退出程序。如果没有这个循环,音乐不会播放。 - Guillaume
你应该查看官方pygame文档:http://www.pygame.org/docs/ref/music.html - Vipul
我找到了一个解决方案(我不知道它是否是最好的,但它有效)。 - Guillaume
2个回答

10
你提供的两个示例存在几个问题。
首先:
while True:
    clock.tick(60)

这是在任何上下文中都是无限循环,不仅限于pygame,并且永远不会退出。

接下来:

while True:
    clock.tick(60)
    time.sleep(10)
    break

在循环的第一次执行中,break 将直接中断循环,并且与以下代码等价

clock.tick(60)
time.sleep(10)

这就是为什么它适用于10秒的歌曲。
如果您想使用pygame.mixer.Sound,应该像这样使用,使用Sound.get_length()
import pygame
import time     
pygame.init()
song = pygame.mixer.Sound("my_song.ogg")
clock = pygame.time.Clock()
song.play()
time.sleep(song.get_length()+1)  # wait the length of the sound with one additional second for a safe buffer
pygame.quit()
print "done"
exit()

pygame 建议使用mixer.music 处理此类事物:

import pygame
import time     
pygame.init()
pygame.mixer.music.load("my_song.ogg")
pygame.mixer.music.play()
while pygame.mixer.music.get_busy() == True:
    continue
pygame.quit()
print "done"
exit()

参考此答案


0

为您的循环设置一个变量,然后检查mixer.music.get_busy()以确定您的循环是否应该停止。

from pygame import mixer

filename =  "mymusic.mp3"

x = mixer.init(frequency=44100)
mixer.music.load(filename)
mixer.music.play()

run = True
while run: 
    # ..do some stuff
    pos = mixer.music.get_pos() / 1000
    print('pos', pos)
    
    if mixer.music.get_busy() == False:
        run = False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接