発音暗記アプリ完成
前回の
ここまでで道具立てが揃ったので組み立てました。
元々、「台湾華語の単語⇒発声・ピンイン(or 注音)」が瞬時に出るようになる訓練・・を想定して作ってきましたが、考えてみたらこれ、単語表示は台湾華語に限らず、英単語に変えてもいい、ピンイン表示欄も、発音記号だけでなく、「訳語」とかに変えてもかまわないし、汎用的に使えそう。用意する教材(CSV)次第で、発音記号でも訳語でも何でもいいよ、と言う意味で「連想」に変えました。
これで、自分で読めるか?覚えているか確認。
「発声」で音で聞く。「連想」を押すと覚えているべき内容が文字表示。
読み上げの言語を
「台湾華語zh-TW」「日本語ja」「アメリカ英語」
から選べるようにもしました。英単語暗記用途だと
factory,工場
warehouse,倉庫
commodity,商品
stock,在庫
warranty,保証
こんなCSVを読み込ませて
コードです。
import csv
import sqlite3
import TkEasyGUI as eg
from myspeech_lib import myspeech
mydb = "mydb.sqlite3"
#メイン画面の作成
def make_main():
lfont = ('標楷體', 100) #大きい表示用フォント
sfont = ('Arial', 50) #小さい表示用フォント
btfont= ('Arial', 20) #ボタン表示用フォント
#表示サンプル
myword = '仮置き'; pinyin = 'karioki'
menu_def = [
['ファイル',['読み込み',['CSV::LoadCSV'], '---', 'Exit']],
]
#メイン画面のレイアウト
layout_main =[
[eg.Menu(menu_def)],
[eg.Combo(values=["zh-TW","ja","en-US"],default_value="zh-TW",key="-LANG-")],
[eg.Button("発声", font = btfont, key ="btn_speak"),
eg.Button("連想", font = btfont, key ="btn_show_pinyin"),
eg.Button("覚えた", font = btfont, key ="btn_OK"),
eg.Button("まだ", font = btfont, key ="btn_NG")],
[eg.Text('サマリー仮置き',
key="summary",font=('Arial', 15))],
[eg.Text(myword, font = lfont, key="disp_main")],
[eg.Text(pinyin, font = sfont, key="disp_sub")],
]
return eg.Window("単語暗記 for Windows(Python版)", layout=layout_main, finalize=True)
#優先データを抽出
def flashcard():
con = sqlite3.connect(mydb)
cur = con.cursor()
def getrow(SQLstr:str):
cur.execute(SQLstr)
return cur.fetchone()
totalcount = getrow("SELECT COUNT(*) FROM t_shengci")[0]
level0count = getrow("SELECT COUNT(*) FROM t_shengci WHERE level = 0")[0]
level1count = getrow("SELECT COUNT(*) FROM t_shengci WHERE level = 1")[0]
level2count = getrow("SELECT COUNT(*) FROM t_shengci WHERE level = 2")[0]
level3count = getrow("SELECT COUNT(*) FROM t_shengci WHERE level = 3")[0]
tempid, temphanzi, temppinyin, templevel, temptimestamp \
= getrow("SELECT id, hanzi, pinyin, level, timestamp FROM t_shengci \
ORDER BY level ASC, timestamp ASC")
resdict={'id':tempid,'hanzi':temphanzi, 'pinyin':temppinyin, 'level':templevel, \
'timestamp':temptimestamp, 'totalcount':totalcount, 'level0count':level0count, \
'level1count':level1count,'level2count':level2count,'level3count':level3count}
con.close()
return(resdict)
#コンテンツ更新
def refresh_content(tempdic):
window["disp_main"].update(tempdic["hanzi"])
window["disp_sub"].update("")
window["summary"].update("レベル0:{}個 レベル1:{}個 レベル2:{}個 レベル3:{}個 合計 {}個"\
.format(tempdic["level0count"],tempdic["level1count"],tempdic["level2count"],\
tempdic["level3count"],tempdic["totalcount"]))
#学習履歴更新
def inc_level(): #覚えていた場合 levelをプラス1
con = sqlite3.connect(mydb)
con.execute("UPDATE t_shengci SET level = {},timestamp = CURRENT_TIMESTAMP WHERE id = {} "\
.format(tempdic["level"]+1,tempdic["id"]))
con.commit()
con.close()
def zero_level(): #忘れていた場合、levelを0
con = sqlite3.connect(mydb)
con.execute("UPDATE t_shengci SET level = {},timestamp = CURRENT_TIMESTAMP WHERE id = {} "\
.format(0,tempdic["id"]))
con.commit()
con.close()
#表示作成
window = make_main()
#最初の読み込み・表示
tempdic = flashcard()
refresh_content(tempdic)
while True:
event, value = window.read()
if event == eg.WIN_CLOSED or event == "Exit": #終わるとき
break
elif event == "LoadCSV": #学習教材をCSVで読み込む処理、古いのは削除
mycsv = eg.popup_get_file("CSVファイルを選択",
file_types=(("All Files", "*.*"), ("CSV Files", "*.csv"), ))
mydb = "mydb.sqlite3"
con =sqlite3.connect(mydb)
with open(mycsv, newline='', encoding='utf-8') as csvfile:
con = sqlite3.connect(mydb)
con.execute("DELETE FROM t_shengci")
csvreader = csv.reader(csvfile, delimiter=',')
for row in csvreader:
con.execute("INSERT INTO t_shengci(hanzi, pinyin) VALUES('{}','{}')"
.format(row[0],row[1]))
con.commit()
con.close()
tempdic = flashcard()
refresh_content(tempdic)
elif event =="btn_speak": #読み上げ
myspeech(value["-LANG-"],tempdic["hanzi"])
elif event =="btn_show_pinyin": #ピンイン表示
window["disp_sub"].update(tempdic["pinyin"])
elif event =="btn_OK": #記憶定着OKなら。Levelを一つ上げ、タイムスタンプ更新,表示データ更新
inc_level()
tempdic = flashcard()
refresh_content(tempdic)
elif event =="btn_NG": #記憶定着NGなら。Levelを0に戻し、タイムスタンプ更新,表示データ更新
zero_level()
tempdic = flashcard()
refresh_content(tempdic)
window.close()
読み上げのために使っているmyspeech は、以前
で用意していたものです。
Pythonが少しでも書けるようになったら作ってみたい、と思っていたアプリを完成にこぎつけることができてうれしいです。
クジラ飛行机様の #TkEasyGUI には大変お世話になりました。お礼申し上げます。