문제 설명
PyAudio로 웨이브를 재생하는 Tkinter 버튼 호출 기능 ‑ 충돌 (Tkinter button calling function to play wave with PyAudio ‑‑ crashes)
버튼을 누르자 마자 계속 눌러져 있고 프로그램이 충돌합니다. 그래도 소리는 재생됩니다. 저는 PyAudio 사이트에서 바로 코드를 사용하고 있으므로 여기에서 충돌이 발생하는 이유가 약간 혼란스럽습니다.
from tkinter import *
import pyaudio
import wave
import sys
root = Tk()
root.title("Compose‑O‑Matic")
root.geometry("400x300")
def play_audio():
chunk = 1024
wf = wave.open('misc_environment3.wav', 'rb')
p = pyaudio.PyAudio()
stream = p.open(
format = p.get_format_from_width(wf.getsampwidth()),
channels = wf.getnchannels(),
rate = wf.getframerate(),
output = True)
data = wf.readframes(chunk)
while data != '':
stream.write(data)
data = wf.readframes(chunk)
stream.stop_stream()
stream.close()
p.terminate()
app = Frame(root)
app.grid()
button_start = Button(app, text = ">", command = play_audio)
button_start.grid()
root.mainloop()
참조 솔루션
방법 1:
Use threading
to play music.
from tkinter import *
import pyaudio
import wave
import sys
import threading
# ‑‑‑ classes ‑‑‑
def play_audio():
global is_playing
chunk = 1024
wf = wave.open('misc_environment3.wav', 'rb')
p = pyaudio.PyAudio()
stream = p.open(
format = p.get_format_from_width(wf.getsampwidth()),
channels = wf.getnchannels(),
rate = wf.getframerate(),
output = True)
data = wf.readframes(chunk)
while data != '' and is_playing: # is_playing to stop playing
stream.write(data)
data = wf.readframes(chunk)
stream.stop_stream()
stream.close()
p.terminate()
# ‑‑‑ functions ‑‑‑
def press_button_play():
global is_playing
global my_thread
if not is_playing:
is_playing = True
my_thread = threading.Thread(target=play_audio)
my_thread.start()
def press_button_stop():
global is_playing
global my_thread
if is_playing:
is_playing = False
my_thread.join()
# ‑‑‑ main ‑‑‑
is_playing = False
my_thread = None
root = Tk()
root.title("Compose‑O‑Matic")
root.geometry("400x300")
button_start = Button(root, text="PLAY", command=press_button_play)
button_start.grid()
button_stop = Button(root, text="STOP", command=press_button_stop)
button_stop.grid()
root.mainloop()