2017-01-25 1 views
-1

Ich habe ein Programm, das ich gerne den internen Bell-Sound "\ a" verwenden würde, da es sowohl auf Linux, Windows und Macs ohne zusätzliche Dateien funktioniert. Funktioniert großartig, wenn das Programm als .py ausgeführt wird. Allerdings möchte ich auch, dass mein Programm ohne ein geöffnetes Terminalfenster ausgeführt wird. Es funktioniert also nicht, wenn das Programm als .pyw läuft, da das Programm nicht mit stdout verbunden ist.Python Bell Sound für Windows oder Mac ohne Terminal

Momentan benutze ich sys.stdout.write ('\ a'), um den Alarm auszulösen, aber ohne das Programm an einem Terminal angeschlossen, wird der Sound nicht ausgelöst (und führt schließlich zum Absturz des Programms).

Ich möchte wieder etwas tun, das standardmäßig für alle Terminalsysteme gilt, also versuche ich, eine Sounddatei zu vermeiden und sie abzuspielen.

Antwort

1

fand ich ein forum post sagen, dass der folgende Code-Schnipsel funktionieren würde:

import Tkinter 
Tkinter.Tk().bell() 

Ich bin nicht sicher, ruhig, wenn es funktioniert hat. Ich bin auf einem Linux-Computer und konnte den Befehl nicht auf meinem Computer ausführen (möglicherweise wurde er vom Administrator oder etwas anderem deaktiviert).

Beachten Sie, dass das obige Snippet ein Tkinter-Fenster öffnet. Ich denke, es wird kein großes Problem sein, das Fenster zu verstecken und es zu schließen, nachdem der Piepton gespielt wurde (Warte auf eine Sekunde oder Glocke() hat eine Art von Ereignis-Listener).

Sorry für nicht genug ins Detail gehen. Ich hoffe nur, dass ich dir einen Hinweis geben kann, weil ich es nicht selbst testen kann. Viel Glück! :)

+0

Großartig, ich benutze bereits Tkinter für die Anwendung. Versuchte es ohne Terminal und es funktionierte das erste Mal. Vielen Dank. – jeffpkamp

1

Unter der Annahme, dass platform.system() den Namen des Betriebssystems angibt, können Sie unter Linux und Windows Folgendes verwenden. Es gibt Ihnen einige Freiheit, einen bestimmten Ton zu wählen.

if platform.system() == 'Linux': 
    import pyaudio 
else: 
    import winsound 

class BeepBase: 
    def __init__ (self): 
     self.normalPars = (1000, 0.1) 
     self.specialPars = (2100, 0.1) 
     self.attentionPars = (400, 0.5) 

if platform.system() == 'Linux': 
    class Beep (BeepBase): 
     def __init__ (self): 
      BeepBase.__init__ (self) 

      self.sampleFreq = 16000 
      self.sampleTime = 1./self.sampleFreq 
      self.attackTime = 0.001 
      self.decayTime = 0.015 

      self.normalWave = self.getWave (*self.normalPars) 
      self.specialWave = self.getWave (*self.specialPars) 
      self.attentionWave = self.getWave (*self.attentionPars) 

      # self.pyAudio = pyaudio.PyAudio() # Gives errors 

     def done (self): # Never called, may leak resources 
      self.pyAudio.terminate() 

     def getWave (self, frequency, duration): 
      wave = ''.join ([ 
       chr (int (128 + 127 * math.sin (2 * math.pi * frequency * time) * max (0, min (1, min (time/self.attackTime, (duration - time)/self.decayTime))))) 
       for time in [self.sampleTime * iSample for iSample in xrange (int (duration/self.sampleTime))] 
      ]) 

      return wave 

     def any (self, wave): 
      self.stream = self.pyAudio.open (
       format = self.pyAudio.get_format_from_width (1), 
       channels = 1, 
       rate = self.sampleFreq, 
       output = True 
      ) 
      sleep (0.025) 
      self.stream.write (wave) 
      sleep (0.15) 
      self.stream.stop_stream() 
      self.stream.close() 

     def normal (self): 
      if main.settings.sound: 
       self.any (self.normalWave) 

     def special (self): 
      if main.settings.sound: 
       self.any (self.specialWave) 

     def attention (self): 
      if main.settings.sound: 
       self.any (self.attentionWave) 
else: 
    class Beep (BeepBase): 
     def normal (self): 
      if main.settings.sound: 
       winsound.Beep (self.normalPars [0], int (self.normalPars [1] * 1000)) 

     def special (self): 
      if main.settings.sound: 
       winsound.Beep (self.specialPars [0], int (self.specialPars [1] * 1000))  

     def attention (self): 
      if main.settings.sound: 
       winsound.Beep (self.attentionPars [0], int (self.attentionPars [1] * 1000)) 

beep = Beep()