如何使用customtkinter更新倒计时标签

问题描述 投票:0回答:1

我正在创建一个录音机,当我想创建倒计时时我遇到了问题

这是我的代码

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

我尝试了一些方法,但都出现了一个错误:

按下按钮时按钮停止,录音后开始倒计时

python tkinter label countdown customtkinter
1个回答
0
投票

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()
也都是阻塞的,但如果您不打算进行相对较长的录音,则不会造成任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.