2017-01-28 21 views
0

私は、Pythonでサブプロセスとして分類されているMPlayerを通じて一連のオーディオファイルを再生しようとしています。クラスで実行中のサブプロセスの停止

次に、.stop()コマンドが呼び出されたとき。私はサブプロセスを.....うまく実行しないようにします。

私が発生し続けることが重要なことは、メインスレッドです。私はPythonを完全に終了させたくありません。

以下は、これまでに試したコードです。

class Alarm: 

    urllib.request.urlretrieve(Settings.news_url, 'news.mp3') 

    tts1 = gTTS(text='Good morning' + Settings.name + 'It is ' + str(date.today()), lang='en') 
    tts2 = gTTS(text='Here is the latest news from the BBC world service', lang='en') 
    tts3 = gTTS(text='The weather for today is ' + Settings.weather_rss.entries[0]['title'].split(' ', 1)[1], lang='en') 
    tts4 = gTTS(text='That is all for now. Have a great day!', lang='en') 

    tts1.save(Settings.greeting) 
    tts2.save(Settings.news_intro) 
    tts3.save(Settings.weather_forecast) 
    tts4.save(Settings.outtro) 


    def play(self):  
     alarmpi = subprocess.call(['mplayer', Settings.greeting, Settings.news_intro, 'news.mp3', Settings.weather_forecast, Settings.outtro]); 

    def stop(self): 
     alarmpi.kill() 

alarm = Alarm() 

on = Thread(target=alarm.play) 
stop = Thread(target=alarm.stop) 
on.start() 
time.sleep(5) 
stop.start() 

ただし、これを実行すると、alarmpiが定義されていないというエラーが表示されます。

この問題を解決する方法はありますか?

ありがとうございます。

答えて

1

だけ

(あなたが最初 playを呼び出すことなく stopを呼び出すことができますので、クラスのコンストラクタで最初に定義する)あなたは stop方法でそれを思い出すことができますので、それを保存するために selfオブジェクトを使用して、クラスの メンバーとして alarmpiを定義します
def __init__(self): 
    self.alarmpi = None 

def play(self):  
    self.alarmpi = subprocess.call(['mplayer', Settings.greeting, Settings.news_intro, 'news.mp3', Settings.weather_forecast, Settings.outtro]); 

def stop(self): 
    if self.alarmpi: 
     self.alarmpi.kill() 
     self.alarmpi = None 
+0

ありがとうございました! ここで属性エラーが発生しました。 AttributeError: 'Alarm'オブジェクトに 'alarmpi'属性がありません。 ' – Keva161

+0

'play'メソッドを変更してもよろしいですか?それは私のためにここで働くからです。 –

+0

ああ、はい。ちょうどアプリケーションを再入力し、期待どおりに動作します:)ありがとう! – Keva161

関連する問題