在Python中使用EasyGUI和PyAudio同时运行GUI和播放警报声

-1 投票
2 回答
2012 浏览
提问于 2025-04-18 07:22

你好,我需要让我的图形界面(GUI)和报警声音同时运行,并且在我点击第二个对话框里的确认按钮时停止报警声音。为了解决这个问题,我创建了两个文件,一个是主文件(使用easygui制作的图形界面),另一个是AudioFile类,它使用pyaudio来播放和停止报警声音。

主文件:

from easygui import *
import sys
from AudioFile import *

    predictions[0] = 1

a = AudioFile("alarm.wav")

if (predictions[0] == 1):
    while 1:
            #play alarm sound
        a.play()
        msgbox("Critical Situation Detected!")


        msg ="Please choose an action?"
        title = "Critical Situation Detected!"
        choices = ["Ignore the Warning", "Contact Doctor", "Call Ambulance Service", "Call Hospital"]
        #choice = choicebox(msg, title, choices)
        choice = multchoicebox(msg, title, choices)

            #stop alarm sound
        a.close()

        # note that we convert choice to string, in case
        # the user cancelled the choice, and we got None.
        msgbox("You chose: " + str(choice), "Action is in Progress")

        msg = "Do you want to continue?"
        title = "Please Confirm"
        if ccbox(msg, title):     # show a Continue/Cancel dialog
                        pass  # user chose Continue
        else:
                        sys.exit(0)           # user chose Cancel

AudioFile:

import pyaudio
import wave
import sys

class AudioFile:
    chunk = 1024

    def __init__(self, file):
        """ Init audio stream """ 
        self.wf = wave.open(file, 'rb')
        self.p = pyaudio.PyAudio()
        self.stream = self.p.open(
            format = self.p.get_format_from_width(self.wf.getsampwidth()),
            channels = self.wf.getnchannels(),
            rate = self.wf.getframerate(),
            output = True
        )

    def play(self):
        """ Play entire file """
        data = self.wf.readframes(self.chunk)
        while data != '':
            self.stream.write(data)
            data = self.wf.readframes(self.chunk)

    def close(self):
        """ Graceful shutdown """ 
        self.stream.close()
        self.p.terminate()

# Usage example for pyaudio
#a = AudioFile("alarm.wav")
#a.play()
#a.close()

当我运行这两个代码时,我希望先播放报警声音,然后在后台显示图形界面。但是实际上,我的应用程序先播放完报警声音后才开始显示图形界面。我该如何让报警声音在图形界面的后台播放,并在我按下第二个确认按钮后停止它呢?

2 个回答

0

我根据@ebarr的示例代码想出了这个解决方案。

主文件:

 predictions[0] = 1

a = AudioFile("alarm.wav")

if (predictions[0] == 1):
    while 1:
        a.start()
        sleep(0.5)
        msgbox("Critical Situation Detected!")


        msg ="Please choose an action?"
        title = "Critical Situation Detected!"
        choices = ["Ignore the Warning", "Contact Doctor", "Call Ambulance Service", "Call Hospital"]
        #choice = choicebox(msg, title, choices)
        choice = multchoicebox(msg, title, choices)

        a.stop()

        # note that we convert choice to string, in case
        # the user cancelled the choice, and we got None.
        msgbox("You chose: " + str(choice), "Action is in Progress")

        msg = "Do you want to continue?"
        title = "Please Confirm"
        if ccbox(msg, title):     # show a Continue/Cancel dialog
                        pass  # user chose Continue
        else:
                        sys.exit(0)           # user chose Cancel

音频文件:

import pyaudio
import wave
import sys

from threading import Thread,Event
from time import sleep

class AudioFile(Thread):
    chunk = 1024

    def __init__(self, file):
        """ Init audio stream """
        Thread.__init__(self)
        self.wf = wave.open(file, 'rb')
        self.p = pyaudio.PyAudio()
        self.stream = self.p.open(
            format = self.p.get_format_from_width(self.wf.getsampwidth()),
            channels = self.wf.getnchannels(),
            rate = self.wf.getframerate(),
            output = True
        )
        self._stop = Event()

def run(self):
    self._stop.clear()
    """ Play entire file """
    while not self._stop.is_set():
        data = self.wf.readframes(self.chunk)
        self.stream.write(data)

    def stop(self):
        """ Graceful shutdown """
        self._stop.set()
        self.stream.close()
        self.p.terminate()

撰写回答