実現したいこと
Python3でボタンで開始、停止できる騒音計を作ろうとしています。
・騒音計のソースコードは以下を参照にしています。
https://hotsmmrblog.com/noise-level-measurement_with_raspberry_pi_and_usb_mic/
・開始ボタンを押したらフラグをTrueに変更して、フラグを確認しif文でtrueなら音量測定開始し、falseになら何もしない。停止ボタンを押したらフラグをfalseに変更して音量測定を停止させる。
・結果をテキストに書き込む。
発生している問題・エラーメッセージ
停止ボタンを押したらフラグをfalseに変更して音量測定を停止させたいのですが、処理が止まらなくて困っています。
停止ボタンを押して止めるとしたらどのようにすればよろしいのでしょうか。
該当のソースコード
import pyaudio import numpy as np import sys import time import tkinter as tk import tkinter.ttk as ttk import tkinter.scrolledtext as tkst class MainApp(tk.Tk): def __init__(self): super(MainApp, self).__init__() p = pyaudio.PyAudio() # set prams INPUT_DEVICE_INDEX = 1 CHUNK = 128 FORMAT = pyaudio.paInt16 CHANNELS = int(p.get_device_info_by_index(INPUT_DEVICE_INDEX)["maxInputChannels"]) SAMPLING_RATE = int(p.get_device_info_by_index(INPUT_DEVICE_INDEX)["defaultSampleRate"]) RECORD_SECONDS = 1 RECORDING = False self.title("騒音測定") # 測定開始ボタン押下時処理 def StartBtnClicked(): RECORDING = True RecordValume() # 測定終了ボタン押下時処理 def StopBtnClicked(): if RECORDING is True: RECORDING = False # ボタンの配置 self.start_btn = ttk.Button(self, text="開始", command = StartBtnClicked, ) self.stop_btn = ttk.Button(self, text="終了", command = StopBtnClicked, ) self.start_btn.grid(row=0, column=2, sticky=tk.W, padx=15, pady=10, ipady=10) self.stop_btn.grid(row=0, column=4, sticky=tk.N, padx=15, pady=10, ipady=10) # amp to db def to_db(x, base=1): y=20*np.log10(x/base) return y # record audio valume def RecordValume(): while self.AudioRecording is True: start = time.time() stream = p.open(format = FORMAT, channels = CHANNELS, rate = SAMPLING_RATE, input = True, frames_per_buffer = CHUNK, input_device_index = INPUT_DEVICE_INDEX ) # get specified range of data. size of data equals (CHUNK * (SAMPLING_RATE / CHUNK) * RECORD_SECONDS) data = np.empty(0) for i in range(0, int(SAMPLING_RATE / CHUNK * RECORD_SECONDS)): elm = stream.read(CHUNK, exception_on_overflow = False) elm = np.frombuffer(elm, dtype="int16")/float((np.power(2,16)/2)-1) data = np.hstack([data, elm]) # calc RMS rms = np.sqrt(np.mean([elm * elm for elm in data])) # RMS to db db = to_db(rms, 20e-6) stream.close() elapsed_time = time.time() - start print("elapsed_time:{:.3f}[sec], DB:{:.3f}[db]".format(elapsed_time, db)) # イベント監視開始処理 def start(self): self.mainloop() if __name__ == "__main__": app = MainApp() app.start()
補足情報(FW/ツールのバージョンなど)
Python3.7.4
回答1件
良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。