我正在创建一个录音机,当我想创建倒计时时我遇到了问题
这是我的代码
from customtkinter import *
import sounddevice
from scipy.io.wavfile import write
import time
recorder = CTk()
info = CTkLabel(recorder, text="Enter the duration of recording", font=("fb agency", 30))
info.pack()
seconds = CTkEntry(recorder, placeholder_text="Enter:")
seconds.pack()
def record():
global seconds
fs = 44100
recorded_voice = sounddevice.rec((int(seconds.get()) * fs), samplerate=fs, channels=2)
second_countdown = int(seconds.get())
while second_countdown > 0:
print(second_countdown)
time.sleep(1)
second_countdown -= 1
print("Finished!")
sounddevice.wait()
write("recorded voice.wav", fs, recorded_voice)
record_btn = CTkButton(recorder, text="RECORD", fg_color="red", command=record)
record_btn.pack()
remaining_time = CTkLabel(recorder, text="not recording")
remaining_time.pack()
recorder.mainloop()
我尝试了一些方法,但都出现了一个错误:
按下按钮时按钮停止,录音后开始倒计时
time.time()
是一个阻塞函数,您永远不应该调用阻塞主循环执行的代码,否则您的应用程序将冻结,因为它将无法响应事件或更新。
在您的情况下,您可以将
after()
与 wait_variable()
一起使用,例如:
import customtkinter as ctk
import sounddevice
from scipy.io.wavfile import write
recorder = ctk.CTk()
info = ctk.CTkLabel(
recorder,
text="Enter the duration of recording",
font=("fb agency", 30)
)
info.pack()
seconds = ctk.CTkEntry(recorder, placeholder_text="Enter:")
seconds.pack()
def record():
fs = 44100
rec_time = int(seconds.get())
record_btn.configure(state=ctk.DISABLED)
recorded_voice = sounddevice.rec(rec_time * fs, samplerate=fs, channels=2)
for remaining_secs in range(rec_time, -1, -1):
recorder.after(1000, remaining_time_var.set, str(remaining_secs))
recorder.wait_variable(remaining_time_var)
sounddevice.wait()
write("recorded voice.wav", fs, recorded_voice)
remaining_time_var.set("Recording completed")
record_btn.configure(state=ctk.NORMAL)
record_btn = ctk.CTkButton(
recorder,
text="RECORD",
fg_color="red",
command=record
)
record_btn.pack()
remaining_time_var = ctk.StringVar()
remaining_time_var.set("not recording")
remaining_time = ctk.CTkLabel(recorder, textvariable=remaining_time_var)
remaining_time.pack()
recorder.mainloop()
after()
安排在指定时间后执行回调。 wait_variable()
等待变量更新。这两个函数都不会阻塞主循环,因此应用程序在等待期间保持响应。
scipy.io.wavfile.write
和sounddevice.wait()
也都是阻塞的,但如果您不打算进行相对较长的录音,则不会造成任何问题。