Python: Ein Piepton

97

Ich versuche, das Programm dazu zu bringen, mir ein piependes Geräusch zu geben. Ich bin auf einer Windows-Maschine. Ich habe mir http://docs.python.org/library/winsound.html angesehen

Aber nicht sicher, wie ich das mit einem Barcode-Scanner programmieren kann.

Hier ist mein Code für den seriellen Barcode-Scanner.

ser = serial.Serial()
ser.baudrate = 9600

#for windows
ser.port = 2 #for COM3

ser.open()
ser.write('hello')
ser.close()

UPDATE: Da ich meine Kollegen mit dem Piepton ärgere. Kann ich es über die Audio-Buchse für Kopfhörer bekommen?

Marc Brigham
quelle
4
Sie möchten, dass der Barcode-Scanner Geräusche macht oder dass die Windows-Maschine auch angeschlossen ist?
Setheron
die Windows-Maschine. Ich denke, der Barcode-Scanner wird es von selbst tun
Marc Brigham
9
Zu "Update": Ja, es ist eine bekannte Tatsache, dass Signaltöne nerven :)
jforberg
Gibt es etwas, das für OS X funktioniert? Ich kann das Winsound-Modul nicht finden.
Charlie Parker
2
@CharlieParker, weil Win-Sound für Windows ist. Drucken Sie stattdessen "\ a".
noɥʇʎԀʎzɐɹƆ

Antworten:

144

Wenn Sie unter Windows nur möchten, dass der Computer einen Signalton ausgibt:

import winsound
frequency = 2500  # Set Frequency To 2500 Hertz
duration = 1000  # Set Duration To 1000 ms == 1 second
winsound.Beep(frequency, duration)

Das winsound.Beep()kann überall dort verwendet werden, wo der Piepton auftreten soll.

CyanRook
quelle
12
Dieser ist ordentlich:def annoy(): for i in range(1, 10): winsound.Beep(i * 100, 200)
Skurmedel
8
Oder def sos(): for i in range(0, 3): winsound.Beep(2000, 100) for i in range(0, 3): winsound.Beep(2000, 400) for i in range(0, 3): winsound.Beep(2000, 100). Ich sollte jetzt wahrscheinlich wieder arbeiten: D
Skurmedel
1
Unter Windows Winsound.Beep wird über Windows Sounds übertragen.
Jakob Bowyer
Ich bin auf einem Mac, kann das nicht auf Pip Repo finden?
Volatil3
Interessant, es existiert nicht in meiner Anakonda-Umgebung ... ist das komisch?
Charlie Parker
127

Der plattformübergreifende Weg, dies zu tun, ist zu print '\a'. Dies sendet das ASCII-Bell-Zeichen an stdout und erzeugt hoffentlich einen Piepton (a für 'alert'). Beachten Sie, dass viele moderne Terminalemulatoren die Option bieten, Glockenzeichen zu ignorieren.

Da Sie unter Windows arbeiten, werden Sie erfreut sein zu hören, dass Windows über eine eigene Beep-API verfügt , mit der Sie Signaltöne beliebiger Länge und Tonhöhe senden können. Beachten Sie, dass dies eine reine Windows-Lösung ist. Daher sollten Sie es wahrscheinlich vorziehen, es print '\a'sei denn, Sie interessieren sich wirklich für Hertz und Millisekunden.

Auf die Beep-API wird über das Winsound- Modul zugegriffen : http://docs.python.org/library/winsound.html

jforberg
quelle
1
Obwohl er speziell nach Windows gefragt hat, denke ich, dass dies die rundum bessere Lösung ist, es sei denn, die WinSound-API wird für Betriebssystemunabhängige auf \ a zurückgesetzt. Es gibt auch viele Audio-APIs
Setheron
2
Ehrlich gesagt würde ich es vermeiden, bei ernsthaften Programmierarbeiten PC-Lautsprechertöne zu spielen. Wenn er tatsächlich unter Windows arbeitet, sollte er wahrscheinlich versuchen, stattdessen das Standard-Warnsignal des Systemthemas abzuspielen. Mit etwas Glück kann auf dieses Signal über jedes von ihm verwendete GUI-Paket zugegriffen werden.
Jforberg
1
Wenn Sie print in einer Konsolen-App verwenden, sollten Sie end = "" hinzufügen, um bei jedem Piepton einen Zeilenumbruch zu vermeiden.
Tony
1
@jforberg Die API dafür ist Winsound.MessageBeep, das MB_ICONASTERISK, MB_ICONEXCLAMATION, MB_ICONHAND, MB_ICONQUESTION und MB_OK aufnehmen kann.
Peter Wood
1
Wenn Sie Python 3 verwenden, vergessen Sie nicht, Klammern zu verwenden, da sonst ein Syntaxfehler angezeigt wird. Verwenden Sie print ('\ a')
ZorroDeLaArena
27

Linux.

$ apt-get install beep

$ python
>>> os.system("beep -f 555 -l 460")

ODER

$ beep -f 659 -l 460 -n -f 784 -l 340 -n -f 659 -l 230 -n -f 659 -l 110 -n -f 880 -l 230 -n -f 659 -l 230 -n -f 587 -l 230 -n -f 659 -l 460 -n -f 988 -l 340 -n -f 659 -l 230 -n -f 659 -l 110 -n -f 1047-l 230 -n -f 988 -l 230 -n -f 784 -l 230 -n -f 659 -l 230 -n -f 988 -l 230 -n -f 1318 -l 230 -n -f 659 -l 110 -n -f 587 -l 230 -n -f 587 -l 110 -n -f 494 -l 230 -n -f 740 -l 230 -n -f 659 -l 460

quelle
12
Aus zwei Gründen abgelehnt: Erstens ist GNU / Linux! = Debian und apt-get nicht universell; Zweitens sollten Sie os.system nicht verwenden, sondern stattdessen das Unterprozessmodul.
Ben
1
Als Linux-Benutzer, der versucht, einen einfachen und billigen Piepton zu erzeugen, wenn ein langer Code beendet ist, war dies bei weitem die einfachste Lösung. Ich habe besonders den kleinen Jingle geliebt! Beachten Sie, dass Sie müssen möglicherweise „sudo modprobe pcspkr“ nennen und Piep installieren , bevor diese Option funktioniert, nach askubuntu.com/questions/19906/beep-in-shell-script-not-working
John Haberstroh
4
os.systemist in Ordnung, besonders mit einem fest codierten Wert, nicht jeder schreibt einen Webserver.
cz
Tippfehler -f 1047-l, sollte sein -f 1047 -l, Platz fehlt
Bartekbrak
@ Ben Alte Frage, aber fwiw es scheint ziemlich hart, dies herabzustimmen. Die Frage bezieht sich auf einen Bereich ohne plattformübergreifende Lösung, wie ich es verstehe. Die akzeptierte Antwort mit 140 Likes ist Windows-spezifisch. Und Sie erklären nicht, warum ein legitimes Modul "schlechte" Praxis ist.
Geotheory
17

Ich habe nach dem gleichen gesucht, aber nach der Linux-Shell.

Das Thema brachte mich zu einer Antwort, danke

Vielleicht pythonischer:

import os
beep = lambda x: os.system("echo -n '\a';sleep 0.2;" * x)
beep(3)

Anmerkungen :

  • Der Schlafwert (hier 0,2) hängt von der Länge (Sekunden) Ihres Standard-Pieptons ab
  • Ich habe mich der Einfachheit halber os.systemeher subprocess.Popenfür die Verwendung entschieden (es könnte schlecht sein)
  • Das '-n' für echosoll keine Anzeige mehr haben
  • das Letzte ';' after sleepist für die resultierende Textsequenz erforderlich (* x)
  • auch durch ssh auf einem X-Term getestet
s4mdf0o1
quelle
3
Python hat das Äquivalent von echo( print) und sleep, daher ist es eigentlich nicht pythonisch, externe Aufrufe durchzuführen, insbesondere wenn es sich um (nicht portierbare) Unix-Aufrufe handelt.
Eric O Lebigot
Was bedeutet (3)?
Bumbumpaw
9

Es gibt eine Windows-Antwort und eine Debian-Antwort. Hier ist eine Mac- Antwort :

Dies setzt voraus, dass Sie nur hier nach einer schnellen Möglichkeit suchen, einen anpassbaren Alarmton zu erzeugen, und nicht speziell nach dem piezeoelektrischen Piepton, den Sie unter Windows erhalten:

os.system( "say beep" )

Haftungsausschluss: Sie können os.systemdas subprocessModul durch einen Aufruf ersetzen, wenn Sie befürchten, dass jemand Ihren Signaltoncode hackt.

Siehe: So lassen Sie den Hardware-Piepton in Mac OS X 10.6 ertönen

cz
quelle
6

Der plattformübergreifende Weg:

import time
import sys
for i in range(1,6):
    sys.stdout.write('\r\a{i}'.format(i=i))
    sys.stdout.flush()
    time.sleep(1)
sys.stdout.write('\n')
FooBar167
quelle
5
Der einzige wichtige Teil davon istsys.stdout.write('\a')
jstrieb
1
@jstrieb - Dies ist ein winziges eigenständiges Programm. Seine Bedeutung für die Vollständigkeit selbst.
FooBar167
4

Ich habe zu diesem Zweck ein Paket gemacht.

Sie können es so verwenden:

from pybeep.pybeep import PyVibrate, PyBeep
PyVibrate().beep()
PyVibrate().beepn(3)
PyBeep().beep()
PyBeep().beepn(3)

Es hängt von Sox ab und unterstützt nur Python3.

qed
quelle
1
Versuchen Sie, pip3 pybeep zu installieren.
Qed
1
Weiß nur, dass du Sox installieren musst. Ausführen: Brew Install Sox
Jam M. Hernandez Q.
3

Verwendung pygameauf jeder Plattform

Der Vorteil der Verwendung pygamebesteht darin, dass sie auf jeder Betriebssystemplattform verwendet werden kann. Der folgende Beispielcode ist jedoch für GNU / Linux .

Installieren Sie zuerst das pygameModul für, python3wie hier ausführlich erläutert .

$ sudo pip3 install pygame

Das pygameModul kann Dateien von jedem Speicherort abspielen .wavund .oggabspielen. Hier ist ein Beispiel:

#!/usr/bin/env python3
import pygame
pygame.mixer.init()
sound = pygame.mixer.Sound('/usr/share/sounds/freedesktop/stereo/phone-incoming-call.oga')
sound.play()
Serge Stroobandt
quelle