停止Winsound /在Python上停止一个线程

时间:2014-04-15 07:01:19

标签: python multithreading audio tkinter

我正在使用Tkinter在python上编写一个litle游戏(顺便说一句,我不允许使用任何其他非内置模块)并且我想在主窗口上播放背景歌曲,这是一个拿着标题,按钮去其他窗口和东西......

所以问题是当我进入另一个窗口时我需要停止声音,但是当我按下按钮去另一个窗口时,这首歌一直在播放......

我正在使用winsound模块,并且在我第一次使用线程运行程序时定义了几个函数(顺便说一句,这些都是邪恶的)以播放这首歌...

所以这是交易,我想要一些东西放在函数“killsound”中,以便我可以将它添加到每个按钮,然后当我按任何按钮打开任何其他窗口时,声音将被杀死。< / p>

我希望像'a.kill()'或'a.stop()'这样的东西,但它没有用。

我真的不知道如何在winsound上使用SND_PURGE的东西......虽然我知道SND_PURGE不再适用于新的Windows操作系统(Got Win8.1)

你能帮我吗?

谢谢! (对不起令人毛骨悚然的英语......)

def Play(nombre): #This function Is the core of the winsound function
   ruta = os.path.join('Audio',nombre)
   Reproducir= winsound.PlaySound(ruta,winsound.SND_FILENAME)
   return Reproducir

def PlayThis(): 
   while flag_play:
       try:
           return Play('prettiest weed.wav')
       except:
           return "Error"

def PlayThisThread():
   global flag_play
   flag_play= True
   a=Thread(target=PlayThis, args=())
   a.daemon = True
   a.start()

   PlayThisThread()


def killsound():  #This is the function I want, for killing sound.
   global flag_play
   flag_play = False

3 个答案:

答案 0 :(得分:3)

您的代码中存在两个主要问题:

  1. 全局变量flag_play必须放在声音播放循环中,在PlayThis()函数
  2. 中的情况下
  3. Winsound模块的目标是简单的非线程使用。当声音被重放时,没有机会轻轻地&#34;轻柔地&#34;打断。它不支持任何播放状态报告,例如.isPlaying()也不需要任何.stop()来杀死它。
  4. 解决方案:

    • 试用PyMedia包。 Pymedia允许更低级别的音频操作,因此必须在初始化时提供更多细节:

      import time, wave, pymedia.audio.sound as sound
      
      # little to do on the proper audio setup
      
      f= wave.open( 'prettiest weed.wav', 'rb' )
      sampleRate= f.getframerate() # reads framerate from the file
      channels= f.getnchannels()
      format= sound.AFMT_S16_LE  # this sets the audio format to most common WAV with 16-bit codec PCM Linear Little Endian, use either pymedia or any external utils such as FFMPEG to check / corvert audio into a proper format.
      audioBuffer = 300000  # you are able to control how much audio data is read
      

    以下结果&#34; snd&#34;成为类sound.Output的一个实例,并为您提供一堆有用的音频方法:

        snd= sound.Output( sampleRate, channels, format )
        s= f.readframes( audioBuffer )
        snd.play( s )
    

    最后你的线程回放循环可能如下所示:

        while snd.isPlaying():
          global flag_play
          if not flag_play: snd.stop()  #here is where the playback gets interupted.
          time.sleep( 0.05 )
    
        f.close()
    

    如果您需要更多支持,请告诉我。

答案 1 :(得分:0)

我还在Adobe Audition中创建了一个0.5秒的wav文件,其中包含静音并将其附加到停止按钮,这基本上“停止”播放以前播放的音频剪辑。

答案 2 :(得分:-1)

我找到了一种方法,通过在一个按钮上添加0.5秒的声音,这样当我按下按钮时它会停止背景一个播放按钮一个,然后停止程序上的所有声音。