質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

解決済

python3:ボタン操作で開始停止できる騒音計

hunburger1
hunburger1

総合スコア3

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1回答

0グッド

0クリップ

209閲覧

投稿2022/11/27 09:38

実現したいこと

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

通常のプログラムはプロセスは1つしか持っていません。 どういう意味かというと、あるタイミングでは1つのことしかできないのです。
ボタンを押して、RecordValume()メソッドの中の、「while self.AudioRecording is True:」のループを回っている間は、そんループの処理しかできない=「# 測定終了ボタン押下時処理」にあるメソッドを処理することはできないということです。

もし、RecordValume()メソッドの実行中に「# 測定終了ボタン押下時処理」のメソッドを動かして、フラグを変更したいのであれば、RecordValume()メソッドの中のwhileの中にある処理は、スレッドや別プロセスにして並列に動作するようにしなければなりません。

投稿2022/11/27 14:47

TakaiY

総合スコア10458

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。