使用pygame.mixer.music.load(file)播音效时出现NoneType错误

0 投票
2 回答
3746 浏览
提问于 2025-04-17 22:37

我试过所有的方法,但就是无法让文件播放

from pygame.locals import *
import pygame, codecs, os
class player(object):
    def __init__(self):
        self.get = dict()
        execfile('audio.conf', self.get)
        self.pid = os.getpid()
        pygame.init()
        self.currentlyBusy=0
        self.songs = list()
        self.nextSong = None
        self.soundInst=None
        self.sLib = None
        self.count = 0
        self.SONG_END = pygame.USEREVENT + 1
    def startPlaying(self, loop=False):
        if self.get['currentSong'] != None:
           if self.currentlyBusy != 1:
               self.play()
               self.currentlyBusy = 1
               else:
                 if self.currentlyBusy == 1 and loop == False:
                 self.stopPlaying()
                 self.play()
    def continueNextSong(self):
        with codecs.open('playlist.db', 'r', 'utf-8-sig') as f:
            for line in f.readlines():
                self.songs.append(line.strip())
                if len(self.songs) == self.count:
                    self.count = 0
                    self.nextSong = self.songs[self.count]
                else:
                    self.nextSong = self.songs[self.count]
    def play(self):
        if len(self.songs) > 0: pass

        else:
           with codecs.open('playlist.db', 'r', 'utf-8-sig') as f:
                           for line in f.readlines():
                                   self.songs.append(line.strip())
                       self.currentlyBusy = 1
                       path=self.songs[self.count]
                       self.sLib = {}
                       sound = self.sLib.get(path)
                       if sound == None:
                         cpath = path.replace('/', os.sep).replace('\\', os.sep)
                         sound = pygame.mixer.music.load(str(cpath))
                         print cpath
                         self.sLib[path] = sound
                         self.soundInst = self.sLib[path]
                         sound.play()
    def stopPlaying(self):
         self.soundInst.stop()
         self.currentlyBusy = 0
    def __START_PLAYER_SERVICE__(self):
         pygame.mixer.music.set_endevent(self.SONG_END)
         self.startPlaying(True)
         while True:
            for evt in pygame.event.get():
                if evt.type == self.SONG_END:
                    if self.get['loop'] == True:
                        self.playLastSong()
                     else:
                        if self.get['ploop'] == True:
                            self.count +=1
                            self.continueNextSong()

    def reload(self):
        execfile('audio.conf', self.get)
    def update(self):
            with codecs.open(self.config, 'wb', "utf-8-sig") as f:
                        song = self.get['currentSong']
                        w= '''
# LOOP THE SONG
loop=%s
# THIS IS JUST A TEXT FILE WITH FILE PATHS OF SONGS
playlist='%s'
# GETS MUSIC FROM THIS DIRECTORY
setMusicDir='%s'
# LOOP THE PLAYLIST
ploop=%s
# CURRENT SONG THE GUI WILL UPDATE THIS
currentSong='%s'
# THIS IS FOR THE VOLUME COMMANDLINE TOOL
# IF YOU DO NOT HAVE "gnome-alsa-mixer" AND "python-alsaaudio" DO NOT ACTIVATE
aSound=%s
# THIS IS A PYTHON SCRIPT THAT CONTROLS THE AUDIO VIA TERMINAL
volumeCommandTool='%s'
# THIS WILL JUST CONTROL VOLUME VIA GUI
volumeGuiControl='%s'
guiPID=%i
playerPID=%i
''' % (self.get['loop'], self.get['playlist'], self.get['setMusicDir'], self.get['ploop'], song, self.get['aSound'], self.get['volumeCommandTool'], self.get['volumeGuiControl'], self.get['guiPID'], self.pid)
                       f.write(u""+w)
                       f.close()
           self.reload()    
if __name__=="__main__":
    self = player()
    self.__START_PLAYER_SERVICE__()

当脚本运行时,如果在config.conf里有currentSong的值,那么它应该会播放这个歌曲。如果没有值的话,就会播放self.songs里的第一个文件。但是当我调用时,

pygame.mixer.music.load(self.song[self.count])

我收到一个错误提示,

Traceback (most recent call last):
  File "player.py", line 100, in <module>
    self.__START_PLAYER_SERVICE__()
  File "player.py", line 58, in __START_PLAYER_SERVICE__
    self.startPlaying(True)
  File "player.py", line 19, in startPlaying
    self.play()
  File "player.py", line 52, in play
    sound.play()
AttributeError: 'NoneType' object has no attribute 'play'

但我不知道该怎么修复这个问题。我正在使用Ubuntu 12.04 LTS 64AMD系统

2 个回答

0
pygame.mixer.music.load(str(cpath))

它不会返回一个声音对象。你可以使用 pygame.mixer.music.play() 来播放当前加载的音乐。

或者:

sound = pygame.mixer.Sound(str(cpath))
channel = sound.play()

你可以加载多个声音,并且可以通过频道对象来进行一些操作。

1

我可能说错了,现在也没法测试这个,不过你可以试试:

pygame.mixer.music.load(str(cpath))
pygame.mixer.music.play()

pygame.mixer.music.load() 这个函数返回的是 None

撰写回答