Кнопка запуска / остановки Tkinter для записи звука в Python - PullRequest
1 голос
/ 10 января 2020

Я пишу программу для записи звука с использованием Tkinter GUI. Для записи самого аудио я использую этот код: https://gist.github.com/sloria/5693955 в неблокирующем режиме.

Теперь я хочу реализовать что-то вроде кнопки пуска / остановки, но чувствую, что мне не хватает что-то. Следующие предположения:

  1. Я не могу использовать оператор while True или функцию time.sleep(), потому что она сломает Tkinter mainloop()

  2. В результате мне, вероятно, придется использовать глобальный bool, чтобы проверить, работает ли моя start_recording() функция

  3. Мне нужно будет вызвать stop_recording в та же функция, что и start_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()

Я знаю, что где-то должно быть все oop, но я не знаю, где (и как).

1 Ответ

1 голос
/ 10 января 2020

Вместо with я бы использовал обычный

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

running.stop_recording()

, поэтому я бы использовал его в двух функциях - start и stop - и мне не понадобится l oop для this.

Мне понадобится только глобальная переменная 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() 
...