gpt4 book ai didi

python - 用于在 Python 中录制音频的 Tkinter 启动/停止按钮

转载 作者:行者123 更新时间:2023-12-01 06:35:36 25 4
gpt4 key购买 nike

我正在编写一个程序来使用 Tkinter GUI 录制音频。为了录制音频本身,我使用以下代码:https://gist.github.com/sloria/5693955在非阻塞模式下。

现在我想实现一些类似开始/停止按钮的东西,但感觉我错过了一些东西。以下假设:

  1. 我不能使用 while True 语句或 time.sleep() 函数,因为它会破坏 Tkinter mainloop()

  2. 因此,我可能必须使用全局 bool 来检查我的 start_recording() 函数是否正在运行

  3. 我必须在与 start_recording 相同的函数中调用 stop_recording,因为两者必须使用相同的对象

  4. 我无法使用 root.after() 调用,因为我希望录音由用户定义。

找到以下问题的代码片段:

import tkinter as tk
from tkinter import Button
import recorder

running = False

button_rec = Button(self, text='Aufnehmen', command=self.record)
button_rec.pack()

button_stop = Button(self, text='Stop', command=self.stop)
self.button_stop.pack()

rec = recorder.Recorder(channels=2)

def stop(self):
self.running = False

def record(self):
running = True
if running:
with self.rec.open('nonblocking.wav', 'wb') as file:
file.start_recording()
if self.running == False:
file.stop_recording()

root = tk.Tk()
root.mainloop()

我知道某个地方一定有一个循环,但我不知道在哪里(以及如何)。

最佳答案

我会使用普通的而不是with

running = rec.open('nonblocking.wav', 'wb')

running.stop_recording()

所以我会在两个函数中使用它 - startstop - 而且我不需要任何循环。

我只需要全局变量 running 即可访问这两个函数中的记录器。

import tkinter as tk
import recorder

# --- functions ---

def start():
global running

if running is not None:
print('already running')
else:
running = rec.open('nonblocking.wav', 'wb')
running.start_recording()

def stop():
global running

if running is not None:
running.stop_recording()
running.close()
running = None
else:
print('not running')

# --- main ---

rec = recorder.Recorder(channels=2)
running = None

root = tk.Tk()

button_rec = tk.Button(root, text='Start', command=start)
button_rec.pack()

button_stop = tk.Button(root, text='Stop', command=stop)
button_stop.pack()

root.mainloop()

关于python - 用于在 Python 中录制音频的 Tkinter 启动/停止按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59686267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com