好玩的Python 摩斯碼發報機

2021-10-07 13:34:48 字數 2989 閱讀 9634

這篇文章介紹利用python聲音模組驅動電腦的音響或者蜂鳴器模擬發報機的聲音,實現乙個摩斯碼發報機。

要模擬發報機聲音首先要能讓電腦發出聲音,可以用winsound模組的beep()函式實現,beep函式帶2個入參,第1個入參為頻率值,第2個入參為發聲的時長。先熟悉下beep()函式的呼叫,下面這個例子中發聲的時長都為1000ms,頻率設定為500,1000和0hz,可以看到在頻率為0hz時拋異常,提示頻率範圍必須是37-32767,這正好覆蓋了人耳能分辨的大部分頻率範圍:

import winsound #匯入winsound模組

interval = 1000  #發聲時長1000ms

freq = 500  #頻率

print('freq=',freq)

winsound.beep(freq,interval) #發出聲音

freq = 1000

print('freq=',freq)

winsound.beep(freq,interval)

freq = 0

print('freq=',freq)

winsound.beep(freq,interval)  #頻率入參必須在37-32767

**********結果**********

freq= 500

freq= 1000

freq= 0

traceback (most recent call last):

file "e:\juzicode\py3study\msy01-摩斯電碼\beep01.py", line 25, in winsound.beep(freq,interval)  #頻率入參必須在37-32767

valueerror: frequency must be in 37 thru 32767

摩斯電碼是用一串長短不一的聲音來表示特定的字元,比如字母s用3個短音表示(...),o用3個長音表示(---),這樣sos用摩斯碼表示就是 「...  ---  ...」 ,如果換成聲音就是3個短音,3個長音,3個短音。這種對應關係可以用字典來表示,下面的code_dict就是數字、字母和常見符號對應的摩斯編碼:

code_dict =
beep()函式的第2個入參就是發聲的時長,所以在控制發出短音和長音時就可以用不同的時長入參來控制發聲的時長:

interv_short = 100  #短音「.」的發聲時長

interv_long = 300  #長音「-」的發聲時長

為了能更好的區分短音和長音,也可以將短音和長音的發聲頻率設定成不一樣,這樣更能方便人耳區分:

freq1=1500   #短音發聲頻率

freq2=2000   #長音發聲頻率

如果遇到短音「.」就使用1500hz的頻率發出100ms時長的聲音,遇到長音「-」就使用2000hz的頻率發出300ms時長的聲音:

if c == '.':

ret = winsound.beep(freq1,interv_short)

print('ret = ',ret)

time.sleep(0.1)

elif c == '-':

ret = winsound.beep(freq2,interv_long) 

print('ret = ',ret)

time.sleep(0.1)

首先提示輸入要傳送的訊息字串,因為編碼字典key值的字母都是大寫,所以需要用字串的upper()方法將輸入的字串轉換為大寫。然後用乙個for迴圈遍歷這一串輸入的訊息字串,每次提取乙個字元,利用這個字元作為key值在編碼字典中找到摩斯碼,再用乙個for迴圈遍歷這個摩斯碼,每次提取乙個摩斯編碼符號,如果符號為短音「.」就呼叫winsound.beep(freq1,interv_short),如果符號為長音「-」則呼叫winsound.beep(freq2,interv_long),訊息字串的每乙個字元之間使用time.sleep(0.5)延時0.5s,方便人耳區分字元間隔。完整的**實現:

print('-----歡迎來到www.juzicode.com')

import time

import winsound

freq1=1500   #短音發聲頻率

freq2=2000   #長音發聲頻率

interv_short = 100  #短音「.」的發聲時長

interv_long = 300   #長音「-」的發聲時長

msg = input('輸入要傳送的訊息:')

msg = msg.upper()   #轉換大寫,摩斯碼中不區分大小寫

code_dict =

for m in msg:

print('m:',m)

code = code_dict.get(m)

if code is none:

print('該符號不在字典中')

continue

print('code',code)

for c in code:

if c == '.':

ret = winsound.beep(freq1,interv_short)

print('ret = ',ret)

time.sleep(0.1) #加入0.1s延時

elif c == '-':

ret = winsound.beep(freq2,interv_long)

print('ret = ',ret)

time.sleep(0.1)  

else:

print('錯誤編碼')

time.sleep(0.5)

效果:

有趣的python-摩斯碼發報機

python 好玩的 桌面清理 管家

博主本人用電腦時一直有乙個不好的習慣,就是喜歡把檔案存在放在桌面上,結果沒過多久桌面就全是各種word,excel檔案了,顯得桌面十分的亂,但是又改不掉這個習慣,真是讓人腦袋疼 電腦桌面就像這樣 使用python編寫乙個電腦桌面清理 管家 自動分析桌面檔案字尾名。將桌面上常規的辦公檔案儲存在e盤下的...

Python一些好玩的方法

開頭嘮叨兩句 有啥好玩的方法可以告訴我,積累一些小 斷 現在有12345五個東西,求分成2,3,4,5組的全排列總和,且每組每個方法不能重複。320種 for i in range 2,6 for j in itertools.permutations 12345 i print int x for...

Python 一些好玩的函式

一 匿名函式 什麼匿名是函式 不需要使用def函式名的函式或者子程式 函式語法 lambda 引數 表示式 函式特點 1 lambda只是乙個表示式,省去定義函式過程,讓 更精簡 2 lambda 在表示式中封裝的邏輯有限 3 不能訪問自己引數序列外或者全域性命名空間的引數 舉例 二 內建map 函...