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


98

Я намагаюся отримати програму, яка видасть мені звуковий сигнал. Я на машині 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-машина, яку він також підключив?
Setheron

віконна машина. Думаю, сканер штрих-коду зробить це сам
Марк Бригам

10
Щодо "оновлення": Так, загальновідомий факт, що звукові сигнали дратують :)
jforberg

2
@CharlieParker, тому що звук виграшу призначений для Windows. Натомість надрукуйте "\ a".
noɥʇʎԀʎzɐɹƆ

Відповіді:


149

Якщо ви хочете просто зробити так, щоб комп’ютер видавав звуковий сигнал:

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

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


12
Цей акуратний: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
На вікнах winsound. Звуковий сигнал переноситься через windows Sounds.
Якоб Боуєр

Я на Mac, не можу знайти це на pip repo?
Волатіл3,

цікаво, це не існує в моєму середовищі анаконди ... це дивно?
Чарлі Паркер,

130

Крос-платформний спосіб зробити це - print('\a'). Це надішле символ ASCII Bell до stdout і, сподіваємось, генерує звуковий сигнал (a для "попередження"). Зауважте, що багато сучасних емуляторів терміналів надають можливість ігнорувати символи дзвоника.

Оскільки ви працюєте в Windows, ви будете раді почути, що Windows має власний (підготуйте) Beep API , який дозволяє надсилати звукові сигнали довільної довжини та висоти. Зауважте, що це рішення лише для Windows, тому вам, мабуть, слід віддати перевагу, print('\a')якщо ви дійсно не піклуєтесь про Герц та мілісекунди.

До Beep API можна отримати доступ через модуль winsound : http://docs.python.org/library/winsound.html


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

2
Чесно кажучи, я б уникнув взагалі відтворення звукових сигналів на ПК-динаміках, серйозно намагаючись програмувати. Якщо він справді працює у Windows, йому, мабуть, слід спробувати відтворити за замовчуванням сигнал "попередження" системної теми. Якщо пощастить, цей сигнал буде доступний через будь-який пакет графічного інтерфейсу, який він використовує.
jforberg

1
Якщо ви використовуєте друк у консольному додатку, додайте end = "", щоб запобігти появі нового рядка кожного разу, коли ви видаєте звуковий сигнал.
Тоні

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

2
Якщо ви використовуєте Python 3, не забувайте використовувати дужки, інакше ви отримаєте синтаксичну помилку. Use print ('\ a')
ZorroDeLaArena

27

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, замість цього використовуйте модуль підпроцесу.
Бен

1
Оскільки користувач Linux намагається отримати простий і дешевий звуковий сигнал, коли триває довгий код, це, безумовно, було найпростішим рішенням. Я особливо любив маленький дзвін. Зверніть увагу, що, можливо, вам доведеться зателефонувати "sudo modprobe pcspkr" та встановити звуковий сигнал, перш ніж цей параметр запрацює, відповідно до askubuntu.com/questions/19906/beep-in-shell-script-not-working
Джон Хаберстрох

4
os.systemце добре, особливо з твердо закодованим значенням, не всі пишуть веб-сервер.
cz

друкарська помилка -f 1047-l, має бути -f 1047 -l, пробіл відсутній
bartekbrak

@Ben Старе запитання, але, зрештою, здається досить жорстким проти цього. Питання стосується сфери, яка не має міжплатформеного рішення, наскільки я розумію. Прийнята відповідь зі 140 вподобаннями стосується Windows. І ви не пояснюєте, чому законний модуль є "поганою" практикою.
геотеорія

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більше не має відображення
  • останній ';' після sleepнеобхідно для отриманої текстової послідовності (* x)
  • також перевірено через ssh на термін X

3
Python має еквівалент і echo( print) і sleep, тому насправді не є пітонічним проходити зовнішні виклики, особливо коли це (не переносні) виклики Unix.
Ерік Лебіго

що означає (3)?
bumbumpaw

9

Є відповідь у Windows та відповідь на Debian, тож ось відповідь на Mac :

Це передбачає, що ви тут просто шукаєте швидкий спосіб видавати настроюваний звуковий сигнал, а не конкретно п’єзоелектричний звуковий сигнал, який ви отримуєте в Windows:

os.system( "say beep" )

Застереження: Ви можете замінити os.systemвикликом subprocessмодуля, якщо ви стурбовані тим, що хтось зламає ваш звуковий код.

Дивіться: Як зробити апаратний звуковий сигнал у Mac OS X 10.6


6

Крос-платформенний спосіб:

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

Це не працює в блокноті
jupyter

4

Я зробив пакет .

Ви можете використовувати його так:

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

Це залежить від sox і підтримує лише python3.


1
Спробуйте pip3 встановити pybeep.
qed

1
Просто знайте, що вам потрібно встановити sox. run: brew install sox
Jam M. Hernandez Q.

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.