Python: hacer un pitido

98

Estoy tratando de que el programa me emita un pitido. Estoy en una máquina de Windows. Miré http://docs.python.org/library/winsound.html

Pero no estoy seguro de cómo puedo programar esto con un escáner de código de barras.

Aquí está mi código para el escáner de código de barras en serie.

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

#for windows
ser.port = 2 #for COM3

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

ACTUALIZACIÓN: Ya que estoy molestando a mis compañeros de trabajo con el pitido. ¿Puedo hacer que pase a través del conector de audio para auriculares?

Marc Brigham
fuente
4
¿Quiere que el escáner de código de barras haga ruido o que la máquina con Windows también esté conectada?
Setheron
la maquina de windows. Creo que el escáner de código de barras lo hará solo
Marc Brigham
10
Re "Actualización": Sí, es un hecho bien conocido que los pitidos son molestos :)
jforberg
2
@CharlieParker porque win sound es para Windows. En su lugar, imprima "\ a".
noɥʇʎԀʎzɐɹƆ

Respuestas:

149

En Windows, si solo desea que la computadora emita un pitido:

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

Se winsound.Beep()puede utilizar donde desee que suene el pitido.

CyanRook
fuente
12
Este es def annoy(): for i in range(1, 10): winsound.Beep(i * 100, 200)
genial
9
O 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). Probablemente debería volver al trabajo ahora: D
Skurmedel
1
En Windows winsound.Beep se transmite a través de Windows Sounds.
Jakob Bowyer
Estoy en Mac, ¿no puedo encontrar esto en pip repo?
Volatil3
interesante, no existe en mi entorno anaconda ... ¿es extraño?
Charlie Parker
130

La forma multiplataforma de hacer esto es print('\a'). Esto enviará el carácter de campana ASCII a la salida estándar y, con suerte, generará un pitido (un para "alerta"). Tenga en cuenta que muchos emuladores de terminal modernos ofrecen la opción de ignorar los caracteres de campana.

Como está en Windows, le alegrará saber que Windows tiene su propia API de pitidos (prepárese) , que le permite enviar pitidos de longitud y tono arbitrarios. Tenga en cuenta que esta es una solución solo para Windows, por lo que probablemente debería preferirla a print('\a')menos que realmente le interesen los hercios y los milisegundos.

Se accede a la API de Beep a través del módulo winsound : http://docs.python.org/library/winsound.html

jforberg
fuente
1
Aunque preguntó específicamente por Windows, creo que esta es la mejor solución, a menos que la API de WinSound vuelva a \ a para el sistema operativo independiente. También hay muchas API de audio
Setheron
2
Francamente, evitaría reproducir los pitidos de los altavoces de la PC por completo en un esfuerzo de programación serio. Si realmente está en Windows, probablemente debería intentar reproducir la señal de "alerta" predeterminada del tema del sistema. Con un poco de suerte, esa señal es accesible a través de cualquier paquete de GUI que esté usando.
jforberg
1
Si usa imprimir en una aplicación de consola, considere agregar end = "" para evitar una nueva línea cada vez que emita un pitido.
Tony
2
@jforberg La api para eso es winsound.MessageBeep que puede tomar MB_ICONASTERISK, MB_ICONEXCLAMATION, MB_ICONHAND, MB_ICONQUESTION y MB_OK.
Peter Wood
2
Si está usando Python 3, no olvide usar paréntesis o obtendrá un error de sintaxis. Use print ('\ a')
ZorroDeLaArena
28

Linux.

$ apt-get install beep

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

O

$ 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

fuente
12
Votado en contra por dos razones: primero, GNU / Linux! = Debian y apt-get no son universales; segundo, no debería utilizar os.system, utilice el módulo de subproceso en su lugar.
Ben
1
Como usuario de Linux que intenta obtener un pitido simple y económico cuando finaliza un código largo, esta fue, con mucho, la solución más fácil. ¡Me encantó especialmente el pequeño jingle! Tenga en cuenta que es posible que deba llamar a "sudo modprobe pcspkr" e instalar un pitido antes de que funcione esta opción, según askubuntu.com/questions/19906/beep-in-shell-script-not-working
John Haberstroh
5
os.systemestá bien, especialmente con un valor codificado, no todo el mundo está escribiendo un servidor web.
cz
error tipográfico -f 1047-l, debería ser -f 1047 -l, falta espacio
bartekbrak
@Ben Antigua pregunta, pero parece bastante duro rechazar esto. La pregunta se relaciona con un área sin una solución multiplataforma, tal como yo la entiendo. La respuesta aceptada con 140 me gusta es específica de Windows. Y no explica por qué un módulo legítimo es una práctica "mala".
geoteoría
17

Estaba buscando lo mismo pero para Linux shell.

El tema me trajo a una respuesta -gracias-

Quizás de manera más pitónica:

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

Notas:

  • el valor de suspensión (aquí 0,2), depende de la duración (segundos) de su pitido predeterminado
  • Elegí usar en os.systemlugar de hacerlo subprocess.Popenpor simplicidad (podría ser malo)
  • la '-n' para echoes no tener más pantalla
  • el último ';' después sleepes necesario para la secuencia de texto resultante (* x)
  • también probado a través de ssh en un término X
s4mdf0o1
fuente
3
Python tiene un equivalente de ambos echo( print) y sleep, por lo que en realidad no es pitónico realizar llamadas externas, especialmente cuando son llamadas Unix (no portátiles).
Eric O Lebigot
¿Qué significa (3)?
bumbumpaw
9

Hay una respuesta de Windows y una respuesta de Debian, así que aquí hay una de Mac :

Esto supone que solo está buscando una forma rápida de hacer un sonido de alerta personalizable, y no específicamente el pitido piezeoeléctrico que recibe en Windows:

os.system( "say beep" )

Descargo de responsabilidad: puede reemplazar os.systemcon una llamada al subprocessmódulo si le preocupa que alguien piratee su código de sonido.

Consulte: Cómo hacer que suene el pitido del hardware en Mac OS X 10.6

cz
fuente
6

La forma multiplataforma:

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
fuente
5
La única parte importante de esto essys.stdout.write('\a')
jstrieb
2
@jstrieb: este es un pequeño programa independiente. Su importancia en la integridad misma.
FooBar167
Esto no funciona en el cuaderno jupyter
Yatin
4

He hecho un paquete para ese propósito.

Puedes usarlo así:

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

Depende de sox y solo es compatible con python3.

qed
fuente
1
Prueba pip3 install pybeep.
qed
1
Solo debes saber que tienes que instalar sox. ejecutar: brew install sox
Jam M. Hernandez Q.28 de
3

Utilizando pygameen cualquier plataforma

La ventaja de usarlo pygamees que se puede hacer que funcione en cualquier plataforma de sistema operativo. Sin embargo, el siguiente código de ejemplo es para GNU / Linux .

Primero instale el pygamemódulo python3como se explica en detalle aquí .

$ sudo pip3 install pygame

El pygamemódulo puede jugar .wavy .oggarchivos desde cualquier ubicación del archivo. Aquí hay un ejemplo:

#!/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
fuente
0

En linux: print('\007') hará que suene la campana del sistema.

Rodrigo
fuente