2015-11-22 7 views
2

Как только я нажимаю кнопку, она остается нажатой, и программа вылетает. Звук действительно играет. Я использую код прямо из сайта PyAudio, поэтому я немного запутался, почему он сбой.Кнопка вызова кнопки Tkinter для воспроизведения волны с помощью 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() 
+0

у вас есть сообщение об ошибке? возможно, проблема в том, что ваша функция работает слишком долго, а mainloop не может выполнять свою работу - используйте «threads». – furas

+0

Как именно я буду использовать потоки для этого? Я попытался поместить функцию в поточный класс, используя «class AudioFile (threading.Thread)» или даже помещая функцию воспроизведения звука внутри потоковой передачи. Thread(), но я все равно получаю тот же результат. Я думаю, возможно, проблема в том, что цикл while не нарушается, но этот код прямо из документации PyAudio (не сбой, когда я комментирую цикл while, хотя, конечно, тогда файл не воспроизводится). – jonnyg1986

ответ

1

Используйте threading, чтобы играть музыку.

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() 
+0

спасибо, что работает – jonnyg1986

+0

Я изменил код, чтобы добавить кнопку STOP и 'is_playing', чтобы остановить музыку внутри темы. – furas

 Смежные вопросы

  • Нет связанных вопросов^_^