老规矩,我们先来看代码👇
import pyaudio
import threading
import wave
import tkinter
class Recorder:
def __init__(self, chunk=1024, channels=1, rate=64000):
self.CHUNK = chunk
self.FORMAT = pyaudio.paInt16
self.CHANNELS = channels
self.RATE = rate
self._running = True
self._frames = []
def start(self):
threading._start_new_thread(self.__recording, ())
def __recording(self):
self._running = True
print('start recording')
self._frames = []
p = pyaudio.PyAudio()
stream = p.open(format=self.FORMAT,
channels=self.CHANNELS,
rate=self.RATE,
input=True,
frames_per_buffer=self.CHUNK)
while self._running:
data = stream.read(self.CHUNK)
self._frames.append(data)
stream.stop_stream()
stream.close()
p.terminate()
def stop(self):
self._running = False
print('stop')
def save(self):
p = pyaudio.PyAudio()
wf = wave.open("001.wav", 'wb')
wf.setnchannels(self.CHANNELS)
wf.setsampwidth(p.get_sample_size(self.FORMAT))
wf.setframerate(self.RATE)
wf.writeframes(b''.join(self._frames))
wf.close()
print("Saved")
##主程序
# 创建窗口
window = tkinter.Tk()
# 给窗口命名
window.title("录音与播放器")
# 设置窗口大小
window.geometry("500x300") #注意其中的x不是乘号!
re = Recorder()
# 设置一个录音按钮
b1 = tkinter.Button(window, text="开始录音", font=("FangSong", 14), width=10, height=1, command=re.start)
b1.place(x=100, y=100, anchor="nw")
# 设置一个停止按钮
b2 = tkinter.Button(window, text="结束录音", font=("FangSong", 14), width=10, height=1, command=re.stop)
b2.place(x=200, y=100, anchor="nw")
#设置一个保存按钮
b3 = tkinter.Button(window, text="保存录音", font=("FangSong", 14), width=10, height=1, command=re.save)
b3.place(x=300, y=100, anchor="nw")
# 主窗口循环
window.mainloop()
与通过输入控制录音的开始和结束的录音机相比(程序及解释见:用python编写录音机——通过输入控制录音的开始和结束)多了tkinter库。这个库也是python自带的库,不需要另外安装。
tkinter库,用来绘制GUI界面,存放按钮等。在此代码的主程序中,有大量的运用。
学习tkinter库时,可以与pygame的界面绘制进行对比。
创建窗口:
window = tkinter.Tk()
窗口命名:
window.title("名字")
窗口大小(注意,其中的长度和宽度之间用小写字母x连接):
window.geometry("500x300")
创建按钮:
b1 = tkinter.Button(window, text="开始录音", font=("FangSong", 14), width=10, height=1, command=re.start)
其中,第一个参数表示按钮绘制的窗口,text参数表示按钮上所显示的内容,font参数表示按钮上内容的字体字号,width和height分别表示按钮的宽的和高度,command参数链接到按下按钮所要执行的指令。
按钮的位置:
b1.place(x=100, y=100, anchor="nw")
参数anchor指起始位置(用north、south、east和west表示),这里的nw(northwest)表示的是以左上角的点为坐标原点。x和y分别表示按钮的左上角的点距离(在笛卡尔坐标系中,以左上角为坐标原点,水平向右的方向为x轴的正方向,竖直向下的方向为y轴的正方向。)。
更多优化请看: