2017-01-17 41 views
0

私はPythonでMP3Playerを作成しようとしています。すべての曲を印刷する「プレイリスト」やプレイリストに指定した曲を再生する「再生[num]」のようなコマンドを入力することができます。私はこれをすべて1つのスレッドで行うことができますが、私が望むのは、別のスレッドを作成して、実際の音楽が再生されている間に(「曲を追加する」または「曲を削除する」などのコマンドを実行できるようにすることです音楽を完成させる)。ここで私は一つのスレッドで持っているものです。スレッドを使ったPython MP3Play

import mp3play, time 
clip = mp3play.load(song) 
clip.play() 
time.sleep(clip.seconds()) #Waits the duration of the song 
clip.stop() 
#Command line asks for input after this 

これは、すべての罰金とダンディに動作しますが、私はこのように、本の中にスレッドを実装しようとすると:

import mp3play, time 

def play(songname): 
    clip = mp3play.load(song) 
    clip.play() 
    time.sleep(clip.seconds()) #Waits the duration of the song 
    clip.stop() 

#Get user input here 
#Check if user inputted command 
#User inputed "play" 
thread.start_new_thread(play,("some_random_song.mp3",)) 

それが出てグリッチ。あなたが曲の途中でアプリケーションを閉じ、音楽がまだ動作し続けるまでは、すべてうまくいくようです。音楽を停止するには、タスクマネージャを開いてタスクを終了する必要があります。だから私は、スレッドを閉じないであろう、だけでなく、「停止」コマンドを持っていることについて考えたが、それは

clip.stop() 

は、私はあなたが)(ISNクリップを停止しようとすると何が起こるかわかりません使用します実行していないので、予防システム(ブーリアンが実行されているかどうかをチェックしている)を実装しました。しかし、今は何もこれまでのところ、ここで、機能していない私のコードです:

def play(filename): 
    global clip 
    clip.play() 
    time.sleep(clip.seconds()) 
    clip.stop() 

playing = False 
clip = "" 

#Get user input 
#blah blah blah command stuff 
#User inputted "play" 
thread.start_new_thread(play,("some_random_song.mp3",)) 
playing = True 
#Goes back to command line 
#User inputted 'stop' this time 
if playing: 
    clip.stop() 
    playing = False 

しかし、私はこれを実行しようとすると、それはスレッドで)(clip.playことを得るが、それを起動しdoesntの。どのように私はこれを回避することができますか、スレッド化せずにこれを行うことが可能かどうかはわかりません。前もって感謝します。

答えて

0

multiprocessing.Processを使用して、別のプロセスを使用してMP3を再生する方がよいでしょう。

MP3ファイルへのパスを取得し、それをProcessとして開始する関数を記述します。

技術的な理由から、(python.orgの)支配的なpython実装では、一度に1つのスレッドしかpythonバイトコードを実行できないようにスレッドを制限しています。おそらくこれは決して不自由なことではないでしょう。

+0

「再生」と入力すると音楽が再生されますが、次のコマンドを要求するポインタ「>」は表示されません(つまり、スレッドはmp3playの 'clip'のためにスリープ状態になります)。私は何か間違っているのですか? –

関連する問題