如何用Esc键停止Python中的"playsound

0 投票
1 回答
33 浏览
提问于 2025-04-14 18:20

我正在写一个程序,用来发出警报声。这个程序可以正常工作,不过我希望用户能通过按下“esc”键来停止声音。我不太确定该用什么样的循环,或者是否需要用数字27来表示“esc”键。

我该怎么写一个简单的过程来实现这个功能?这个过程应该放在代码的哪个位置呢?

from playsound import playsound
import time


CLEAR = "\033[2J"
CLEAR_AND_RETURN = "\033[H"


def alarm(seconds): 
    time_elapsed = 0

    print(CLEAR)
    while time_elapsed < seconds: 
        time.sleep(1)
        time_elapsed += 1

        time_left = seconds - time_elapsed
        minutes_left = time_left // 60 
        seconds_left = time_left % 60 

        print(f"{CLEAR_AND_RETURN}Alarm will sound in: {minutes_left:02d}:{seconds_left:02d}")


    playsound("alarm.mp3")

minutes = int(input("How many minutes to wait until alarm sounds?:"))
seconds = int(input("How many seconds to wait until alarm sounds?:"))
total_seconds = minutes * 60 + seconds
alarm(total_seconds)
alarm(2)

1 个回答

0

Playsound这个库并不是最好的选择,因为它没有停止播放声音的功能。一旦开始播放,唯一能停止的方法就是等声音文件播放完(根据文档的说明)。

解决这个问题的一种方法是使用multiprocessing,这样你就可以在任何时候停止播放,而不需要退出程序。我会使用keyboard这个模块来检测按键:

from playsound import playsound
import multiprocessing
import keyboard

CLEAR = "\033[2J"
CLEAR_AND_RETURN = "\033[H"

def start(): #once alarm() is finished, now we start playing the sound
    p = multiprocessing.Process(target=play)
    p.start()
    keyboard.add_hotkey(lambda: end(p), 'esc') #whenever we press esc, it calls the function end() with the argument p (which is our process)

def end(p):
    p.terminate() #makes the sound stop playing

def play():
    playsound("alarm.mp3")

def alarm(seconds): 
    time_elapsed = 0

    print(CLEAR)
    while time_elapsed < seconds: 
        time.sleep(1)
        time_elapsed += 1

        time_left = seconds - time_elapsed
        minutes_left = time_left // 60 
        seconds_left = time_left % 60 

        print(f"{CLEAR_AND_RETURN}Alarm will sound in: {minutes_left:02d}: 
{seconds_left:02d}")

    start()

minutes = int(input("How many minutes to wait until alarm sounds?:"))
seconds = int(input("How many seconds to wait until alarm sounds?:"))
total_seconds = minutes * 60 + seconds
alarm(total_seconds)

不过...我之前提到过playsound并不是最好的模块。使用pyaudio会更好。你可以看看这个StackOverflow的帖子(我从那里得到了multiprocessing的代码),了解如何使用pyaudioPyaudio允许你播放和停止音频,而不需要用到multiprocessing

撰写回答