2017-01-17 43 views
0

我想用python(不使用任何花哨的GUI,只是基本的命令行)创建MP3Player。您可以输入命令,如打印所有歌曲的“播放列表”或播放播放列表中播放指定歌曲的“播放[num]”。我可以在一个线程中完成这一切,但我想要的是创建另一个线程,以便在实际播放音乐的同时可以执行更多命令,如“添加歌曲”或“删除歌曲”(而不是等待音乐完成)。以下是我有一个线程: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()的线程,但犯规启动它。我不知道如何解决这个问题,如果可以不用线程就可以做到这一点。提前致谢。

回答

0

这将是更好的MP3,使用不同工艺,采用multiprocessing.Process玩。

编写一个函数,花费一个MP3文件的路径,并开始,作为一个Process

由于技术原因,占主导地位的Python实现(从python.org)限制线程,以便只有一次一个线程可以执行Python字节码。这可能永远不会有问题。

+0

当我键入“玩”它开始播放音乐,但它并没有显示指针“>”要求的下一个命令(即线程被捆绑起来'sleep'ing为mp3play'clip')。难道我做错了什么? –