見出し画像

発音暗記アプリの実装(1)

(Python学習初心者の試行錯誤・備忘録です)
発音を覚えたい単語の例として

韭菜盒子,jiǔ cài hé zi
高麗菜盒子,gāo lí cài hé zi
酸菜盒子,suān cài hé zi
蘿蔔絲捲,luó bo sī juǎn
豆腐捲,dòu fu juǎn
豬肉餡餅,zhū ròu xiàn bǐng
牛肉捲餅,niú ròu juǎn bǐng
豬肉捲餅,zhū ròu juǎn bǐng

こんな感じで覚えたい繁体字漢字とピンインが入っているCSVファイル(data1.csv)を準備しました。まえにこちら

で試したSQLiteとDB Browserを使って、mydb.sqlite3 の中に t_shengciというテーブルを用意します。生詞(shēng cí)から。

CREATE TABLE "t_shengci" (
	"id"	INTEGER,
	"hanzi"	TEXT NOT NULL,
	"pinyin" TEXT,
	"level"	INTEGER DEFAULT 0,
	"timestamp"	TEXT DEFAULT CURRENT_TIMESTAMP,
	PRIMARY KEY("id" AUTOINCREMENT)
);

・メニューから、「ファイル」ー「読み込み」ー「CSV」

と、選んだ時、
・TkEasyGUIのFileBrowseを使って、CSVファイルを開き、読み込み、t_shengciに格納する。
という動作をさせたい。

てるてる様のこちら記事の画面遷移のやり方を拝見して、「特定のイベントが押されたら別ウィンドウを表示し、ボタンを押したら返り値を出力する」実装(サンプルコード2の流れ)で作ってみました。
てるてる様、ありがとうございます。

まず、メインウィンドウを作成する処理を関数にまとめ、動作確認。

import TkEasyGUI as eg
def make_main():
    lfont = ('標楷體', 100) #大きい表示用フォント
    sfont = ('Arial', 50) #小さい表示用フォント
    btfont= ('Arial', 20) #ボタン表示用フォント

    #表示サンプル
    myword = '韭菜盒子'
    pinyin = 'jiǔ cài hé zi'
    menu_def = [
        ['ファイル',['読み込み',['CSV::LoadCSV'],  '---', 'Exit']],
    ]

    layout_main =[
        [eg.Menu(menu_def)],
        [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('レベル0:9個 レベル1:2個 レベル2:1個 レベル3:2個 合計 14個',
        key="summary",font=('Arial', 15))],
        [eg.Text(myword, font = lfont, key="disp_main")],
        [eg.Text(pinyin, font = sfont, key="disp_sub")],
    ]
    return eg.Window("台湾華語発音暗記", layout=layout_main, finalize=True)

#実行部
window = make_main()
while True:
    event, value = window.read()
    print(event)
    if event == eg.WIN_CLOSED or event == "Exit":
        break       
window.close()

(※このあと、CSVファイル読み込みの画面作るために、ややこしいことやっていますが、全く不要だったことが分かりました(笑)。次回記事で書きます。これはあくまで試行錯誤の記録・備忘録としてだけ残します。)
次にCSV読み込み画面用の関数

def activate_opencsv_window():
    layout_opencsv = [
        [eg.Text("ファイルパス", size=(40,1))],
        [eg.Text("", key ="-filepath-")],
        [eg.FileBrowse("Browse", target_key="-filepath-"), eg.Submit('Submit',key="-submit-")],
    ]
    opencsv_window = eg.Window("教材CSV読み込み", layout=layout_opencsv, finalize = True)
    res = None
    
    while True:
        event, value = opencsv_window.read()
        print(event)
        if event == eg.WIN_CLOSED or event == "Exit":
            break
        elif event == "-submit-":
            res="-submit-"
            break
    opencsv_window.close()
    return res

実行部にLoadCSVイベントへの対応を追加

#実行部
window = make_main()
while True:
    event, value = window.read()
    print(event)
    if event == eg.WIN_CLOSED or event == "Exit":
        break 
    elif event == "LoadCSV":
        res = activate_opencsv_window()
        print(res)      
window.close()

これで

これが開く、Browseでファイルを選択すると

と表示される。画面遷移が期待通りに動くことを確認できました。

※なお、CSV読み込み画面で

    layout_opencsv = [
        [eg.Text("ファイルパス", size=(40,1))],
        [eg.Text("", key ="-filepath-")],
        [eg.FileBrowse("Browse", target_key="-filepath-"), eg.Submit('Submit',key="-submit-")],
    ]

のように、ファイルパス表示にTextを使っています。一行入力ボックスInput を使った場合、画面遷移を複数回繰り返した場合にエラーが出たので、今のところはTextで代用しています。


この記事が気に入ったらサポートをしてみませんか?