2017-03-24 2 views
0

Je suis très nouveau sur Python et j'essayais d'utiliser une belle bibliothèque (audiotools) pour jouer une playlist mp3, juste comme un exercice.Pourquoi cette AttributeError?

C'est la classe pour jouer la tracklist (vaguement basé sur THIS, une fois que j'ai découvert il y a une « fonction de rappel sans argument qui est appelé par le joueur lorsque la piste en cours est terminée » (*)):

class Trackplay: 
    def __init__(self, 
       track_list, 
       audio_output=audiotools.player.open_output('ALSA'), 
       replay_gain=audiotools.player.RG_NO_REPLAYGAIN): 

     self.track_index = INDEX - 1 
     self.track_list = track_list 

     self.player = audiotools.player.Player(
       audio_output, 
       replay_gain, 
       self.next_track()) 

    def next_track(self): 
     try: 
      self.track_index += 1 
      current_track = self.track_list[self.track_index] 
      print str(current_track) 
      audio_file = audiotools.open(current_track) 

      self.player.open(audio_file) # <---------- error 
      self.player.play() 
     except IndexError: 
      print('playing finished') 

Je vous appelle:

tp = Trackplay(get_track_list(PATH))

get_track_list est une méthode retournant une liste de fichiers MP3 à partir du répertoire PATH.

L'erreur que je reçois (à la ligne tracée avec le commentaire « erreur ») est:

AttributeError: Trackplay instance has no attribute 'player'

Je ne comprends pas ce qui se passe ... mais lire toutes les AttributeError des questions ici, doit être quelque chose stupide ...

player me semble exactement un attribut de Trackplay. D'autres attributs, comme track_index et track_list semblent OK, puisque la ligne print str(current_track) imprime la piste actuelle.

Merci pour toute aide.

+0

Quel est votre système d'exploitation? –

+0

Essayé à la fois sur le Rapsberry Pi avec Raspbian et l'ordinateur portable avec Linux Mint. La version Python est 2.7.12 – dentex

Répondre

1

Voir ce code?

self.player = audiotools.player.Player(
     audio_output, 
     replay_gain, 
     self.next_track()) 

Dans le cadre de la création de la Player vous allez attribuer à self.player, vous appelez self.next_track(). self.next_track essaie de utiliser self.player, avant que self.player existe!

def next_track(self): 
    try: 
     self.track_index += 1 
     current_track = self.track_list[self.track_index] 
     print str(current_track) 
     audio_file = audiotools.open(current_track) 

     self.player.open(audio_file) 
     self.player.play() 
    except IndexError: 
     print('playing finished') 

next_track ne retourne même pas quoi que ce soit, il est donc déconcertant pourquoi vous essayez de passer self.next_track() comme argument pour Player.

Était-ce censé être un rappel? Si oui, vous devez passer self.next_track à Playersans l'appeler.

self.player = audiotools.player.Player(
     audio_output, 
     replay_gain, 
     self.next_track) 
#     ^no call parentheses 
+0

BINGO! J'ai enlevé les parenthèses et puis ai appelé un 'self.next_track()' avec les parenthèses (comme méthode) après et cela fonctionne ... Une chanson après l'autre ... merci beaucoup. Je comprends ce que tu dis à propos de l'appel avant même que le 'player' n'existe ... maintenant c'est clair ... Je l'ai dit dans l'erreur Q, noob - enfin, en fait deux: les parenthèses pour le callback et l'appel avant affectation - COOL. :) – dentex