как начать и остановить запись одной кнопкой - PullRequest
0 голосов
/ 24 февраля 2020

У меня проблема с этим кодом, когда я пытаюсь запустить этот код с двумя отдельными кнопками, он работает нормально, но когда я пытаюсь использовать только одну кнопку, чтобы начать и остановить запись, изменив ее текст (метку) на начать и остановить запись код не работает. Текст кнопки меняется, но ничего не записывается.

import tkinter as tk
import threading
import pyaudio
import wave
from tkinter import *
import tkinter.font as font
from tkinter.filedialog import asksaveasfile

class App():
    chunk = 1024 
    sample_format = pyaudio.paInt16 
    channels = 2
    fs = 44100 
    def __init__(self,master):

        self.isrecording = False
        self.frames = []
        myFont = font.Font(weight="bold")
        self.button1 = tk.Button(main, text='Record',command=self.change,height=2,width=20,bg='#0052cc', fg='#ffffff')
        #self.button2 = tk.Button(main, text='stop',command=self.stoprecording,height=2,width=20,bg='#0052cc', fg='#ffffff')
        self.button1['font'] = myFont
        self.button1.place(x=30, y=30)

    def startrecording(self):

        self.isrecording = True
        self.p = pyaudio.PyAudio()  
        self.stream = self.p.open(format=self.sample_format,channels=self.channels,rate=self.fs,frames_per_buffer=self.chunk,input=True)


        print('Recording')
        t = threading.Thread(target=self.record)
        t.start()
    def stoprecording(self):

        self.isrecording = False
        print('recording complete')


        self.filename = asksaveasfile(initialdir = "/",title = "Save as",mode='wb',filetypes = (("audio file","*.wav"),("all files","*.*")),defaultextension=".wav")

        wf = wave.open(self.filename)
        wf.setnchannels(self.channels)
        wf.setsampwidth(self.p.get_sample_size(self.sample_format))
        wf.setframerate(self.fs)
        wf.writeframes(b''.join(self.frames))
        wf.close()
        main.destroy()
    def change(self):
        if self.button1['text'] == 'Record':
            self.startrecording()
            self.isrecording = True
            self.button1.config(text="Stop")
        else:
            self.stoprecording()
            self.isrecording = False
            self.button1.config(text="Record")
    def record(self):

        while self.isrecording:
            data = self.stream.read(self.chunk)
            self.frames.append(data)



main = tk.Tk()
main.title('recorder')
main.geometry('520x120')
app = App(main)
main.mainloop()

ошибка изображения enter image description here

...