Python: издает звуковой сигнал


104

Я пытаюсь заставить программу издавать звуковой сигнал. Я на Windows-машине. Я посмотрел http://docs.python.org/library/winsound.html

Но не знаю, как запрограммировать это с помощью сканера штрих-кода.

Вот мой код для серийного сканера штрих-кода.

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

#for windows
ser.port = 2 #for COM3

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

ОБНОВЛЕНИЕ: так как я раздражаю своих коллег звуковым сигналом. Можно ли заставить его выходить через аудиоразъем для наушников?


4
Вы хотите, чтобы сканер штрих-кода издавал шум или компьютер с Windows, к которому он подключен?
Сетерон

машина windows. Я думаю, что сканер штрих-кода сделает это сам,
Марк Бригам

11
Re "Update": Да, это общеизвестный факт, что гудки раздражают :)
jforberg

2
@CharlieParker, потому что звук для Windows. Вместо этого выведите "\ a".
noɥʇʎԀʎzɐɹƆ

Ответы:


158

В Windows, если вы хотите, чтобы компьютер просто издал звуковой сигнал:

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

winsound.Beep()Может использоваться везде , где вы хотите , чтобы произойти звуковой сигнал.


13
Этот def annoy(): for i in range(1, 10): winsound.Beep(i * 100, 200)
замечательный

9
Или 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). Я, наверное, должен вернуться к работе сейчас: D
Скурмедель

1
На windows winsound. Звук разносится по окнам.
Jakob Bowyer

Я на Mac, не могу найти это в репозитории pip?
Volatil3

интересно, его нет в моей среде анаконды ... это странно?
Чарли Паркер

131

Кросс-платформенный способ сделать это - print('\a'). Это отправит символ ASCII Bell на стандартный вывод и, надеюсь, сгенерирует звуковой сигнал (для «предупреждения»). Обратите внимание, что многие современные эмуляторы терминала позволяют игнорировать символы звонка.

Поскольку вы работаете в Windows, вы будете счастливы услышать, что в Windows есть собственный (приготовьтесь) Beep API , который позволяет отправлять гудки произвольной длины и высоты. Обратите внимание, что это решение только для Windows, поэтому вам, вероятно, следует предпочестьprint('\a') если вы действительно не заботитесь о Герцах и миллисекундах.

Доступ к Beep API осуществляется через модуль winsound : http://docs.python.org/library/winsound.html


1
Хотя он спросил конкретно о Windows, я думаю, что это лучшее решение, если только WinSound API не вернется к \ a для независимой от ОС. Также существует множество аудио API
Сетерон

2
Честно говоря, я бы вообще отказался от воспроизведения звуковых сигналов в динамиках ПК при серьезном программировании. Если он действительно работает в Windows, ему, вероятно, следует вместо этого попытаться воспроизвести сигнал предупреждения системной темы по умолчанию. Если повезет, этот сигнал будет доступен через любой графический интерфейс, который он использует.
jforberg

1
Если вы используете печать в консольном приложении, подумайте о добавлении end = "", чтобы не вводить новую строку каждый раз, когда вы подаете звуковой сигнал.
Тони

2
@jforberg API для этого - winsound.MessageBeep, который может принимать MB_ICONASTERISK, MB_ICONEXCLAMATION, MB_ICONHAND, MB_ICONQUESTION и MB_OK.
Питер Вуд

2
Если вы используете Python 3, не забудьте использовать круглые скобки, иначе вы получите синтаксическую ошибку. Используйте print ('\ a')
ZorroDeLaArena

28

Linux.

$ apt-get install beep

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

ИЛИ

$ 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

12
Проголосовали против по двум причинам: во-первых, GNU / Linux! = Debian и apt-get не универсальны; во-вторых, вы не должны использовать os.system, вместо этого используйте модуль subprocess.
Бен

1
Как пользователь Linux, пытающийся получить простой и дешевый звуковой сигнал при завершении длинного кода, это было, безусловно, самым простым решением. Мне особенно понравился этот маленький джингл! Обратите внимание, что вам, возможно, придется вызвать «sudo modprobe pcspkr» и установить звуковой сигнал, прежде чем эта опция заработает, согласно askubuntu.com/questions/19906/beep-in-shell-script-not-working
Джон

6
os.systemэто нормально, особенно с жестко заданным значением, не все пишут веб-сервер.
cz

опечатка -f 1047-l, должно быть -f 1047 -l, пробел отсутствует
bartekbrak

@Ben Старый вопрос, но, кажется, довольно сурово отрицать это. Вопрос касается области, в которой нет кроссплатформенного решения, насколько я понимаю. Принятый ответ со 140 лайками относится к Windows. И вы не объясняете, почему законный модуль - это «плохая» практика.
geotheory

17

Я искал то же самое, но для оболочки Linux.

Тема привела меня к ответу, -спасибо-

Может быть, более питоническим образом:

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

Примечания :

  • значение сна (здесь 0,2) зависит от продолжительности (в секундах) вашего звукового сигнала по умолчанию
  • Я решил использовать, os.systemа не subprocess.Popenдля простоты (это могло быть плохо)
  • '-n' echoозначает, что больше не отображается
  • последний ';' after sleepнеобходимо для результирующей текстовой последовательности (* x)
  • также тестировался через ssh на терминале X

3
Python имеет эквивалент both echo( print) и sleep, поэтому на самом деле это не pythonic для выполнения внешних вызовов, особенно когда они (непереносимые) вызовы Unix.
Эрик О Лебигот

что означает (3)?
bumbumpaw

11

Есть ответ Windows и ответ Debian, так что вот ответ Mac :

Это предполагает, что вы просто ищете быстрый способ сделать настраиваемый звуковой сигнал, а не пьезоэлектрический сигнал, который вы получаете в Windows:

os.system( "say beep" )

Отказ от ответственности: вы можете заменить os.systemвызовом subprocessмодуль, если беспокоитесь о том, что кто-то взломает ваш звуковой код.

См .: Как сделать звуковой сигнал оборудования в Mac OS X 10.6


7

Кроссплатформенный способ:

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')

5
Единственная важная часть этогоsys.stdout.write('\a')
jstrieb

2
@jstrieb - это крошечная отдельная программа. Его важность в самой полноте.
FooBar167

1
Это должен быть главный ответ
Два

3

Я сделал для этого пакет .

Вы можете использовать это так:

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

Это зависит от sox и поддерживает только python3.


1
Попробуйте pip3 установить pybeep.
Qed 05

1
Просто знайте, что вам нужно установить sox. run: brew install sox
Jam M. Hernandez Q.

не работает в Windows Py 3.8
Джейми Изадди Радд,

3

Использование pygameна любой платформе

Преимущество использования в pygameтом, что его можно заставить работать на любой платформе ОС. Однако ниже пример кода предназначен для GNU / Linux .

Сначала установите pygameмодуль, python3как подробно описано здесь .

$ sudo pip3 install pygame

pygameМодуль может воспроизводить .wavи .oggфайлы из любого расположения файла. Вот пример:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.