2017-03-24 14 views
0

私は非常にPythonには新しく、ちょうどエクササイズのようにmp3プレイリストを再生するには素晴らしいライブラリ(audiotools)を使用しようとしていました。なぜこのAttributeError?

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') 

この

は、トラックリストを再生するためのクラスです(私は (*)を「現在のトラックが終了したプレイヤーによって呼び出される引数なしでコールバック関数」がある発見したら緩く、 THISに基づきます)そして、私が呼んでいる

get_track_listはDIR PATHからMP3ファイルのリストを返すメソッドです

tp = Trackplay(get_track_list(PATH))

私は(「エラー」のコメントでマークされた行で)得るエラーは次のとおりです。

AttributeError: Trackplay instance has no attribute 'player'

私は何が起こっているかを理解し...しかし、ここにすべてのAttributeError質問を読んでいない、何かでなければなりません愚かな...

player私にはちょうどTrackplayの属性のようです。他の属性、track_indextrack_listは、print str(current_track)行が現在のトラックを出力するので、OKと思われます。

ありがとうございました。

+0

お使いのOSは? –

+0

RaspbianのRapsberry PiとLinux Mintのラップトップの両方で試しました。 Pythonのバージョンは2.7.12 – dentex

答えて

1

ここでこのコードを参照してください。

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

Playerあなたはself.playerに割り当てるつもり作成の一環として、あなたはself.next_track()を呼び出します。 self.next_trackを使用しますself.playerself.playerが存在する前に!あなたはPlayerへの引数として渡す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) 
     self.player.play() 
    except IndexError: 
     print('playing finished') 

next_trackでも、何も返しません。

これはコールバックであるはずですか?その場合はと呼ばずにself.next_trackPlayerに渡す必要があります。

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

BINGO!私はかっこを取り除き、その後、メソッドとして括弧をつけて 'self.next_track()'を呼び出し、それがうまくいっています...他の曲の後の一つの曲... soooたくさんありがとう。私は、あなたがプレイヤーが存在する前に呼び出しについて言うことを理解しています...それは明らかです...私はQのnoobエラーでそれを言った - 実際には2つ:コールバックのコールバックと代入前の呼び出し - クール。 :) – dentex

関連する問題