Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tkinter开始/停止按钮,用于在Python中录制音频_Python_Audio_Tkinter_Pyaudio_Recording - Fatal编程技术网

Tkinter开始/停止按钮,用于在Python中录制音频

Tkinter开始/停止按钮,用于在Python中录制音频,python,audio,tkinter,pyaudio,recording,Python,Audio,Tkinter,Pyaudio,Recording,我正在编写一个程序,用Tkinter GUI录制音频。对于录制音频本身,我使用以下代码:在非阻塞模式下 现在我想实现一些东西,比如启动/停止按钮,但我觉得我错过了一些东西。以下假设: 我不能使用while True语句,也不能使用time.sleep()函数,因为它将中断Tkintermainloop() 因此,我可能必须使用全局bool来检查我的start\u recording()函数是否正在运行 我必须以与start\u recording相同的函数调用stop\u recording,因

我正在编写一个程序,用Tkinter GUI录制音频。对于录制音频本身,我使用以下代码:在非阻塞模式下

现在我想实现一些东西,比如启动/停止按钮,但我觉得我错过了一些东西。以下假设:

  • 我不能使用
    while True
    语句,也不能使用
    time.sleep()
    函数,因为它将中断Tkinter
    mainloop()

  • 因此,我可能必须使用全局
    bool
    来检查我的
    start\u recording()
    函数是否正在运行

  • 我必须以与
    start\u recording
    相同的函数调用
    stop\u recording
    ,因为两者必须使用相同的对象

  • 我无法使用
    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()
    
    

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

    使用
    而不是
    我将使用普通

    running = rec.open('nonblocking.wav', 'wb')
    
    running.stop_recording()
    
    因此,我将在两个函数中使用它-
    start
    stop
    ,并且我不需要任何循环

    我只需要全局变量
    运行
    ,就可以访问这两个函数中的记录器

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

    从中选择一个,我将使用全局
    文件
    变量并使用
    文件=打开()。然后我会在
    stop()
    中使用
    file.stop\u recording()
    ,下面是一个带有开始/停止按钮的GUI记录器示例:。它没有使用PyAudio,但它可能会有所帮助。