平假名
あいうえお はひふへほ
かきくけこ まみむめも
さしすせそ や ゆ よ
たちつてと らりるれろ
なにぬねの わ を ん
片假名
アイウエオ ハヒフヘホ
カキクケコ マミムメモ
サシスセソ ヤ ユ ヨ
タチツテト ラリルレロ
ナニヌネノ ワ ヲ ン
平假名
がぎぐげご きゃきゅきょ ぎゃぎゅぎょ
ざじずぜぞ しゃしゅしょ じゃじゅじょ
だぢづでど ちゃちゅちょ ぢゃぢゅぢょ
ばびぶべぼ にゃにゅにょ
ぱぴぷぺぽ ひゃひゅひょ びゃびゅびょ ぴゃぴゅぴょ
片假名
ガギグゲゴ キャキュキョ ギャギュギョ
ザジズゼゾ シャシュショ ジャジュジョ
ダヂヅデド チャチュチョ ヂャヂュヂョ
バビブベボ ニャニュニョ
パピプペポ ヒャヒュヒョ ビャビュビョ ピャピュピョ
有些時候一個發音可能會有兩種拼寫方式
例如「ぢ」的發音可以拼成 ji
或 di
有些時候發音和輸入法也不完全一樣
例如「ち」的發音是 chi
但輸入法可以是 ti
或 chi
category
列出不同發音的類別
hiragana
列出每一排的平假名
katakana
列出每一排的片假名
spell
是假名對應的拼音
透過 gr.Tabs
和 gr.Tab
來區分「選題」與「作答」
import gradio as gr
with gr.Blocks() as app:
with gr.Tabs(selected=0) as tabs:
with gr.Tab(label="設定", id=0):
# 選擇要練習的假名
with gr.Tab(label="測驗", id=1):
# 測驗的內容
直接 return
一個新的 gr.Tabs
物件
就可以切換到新的分頁
def start_test(...):
# 取得要練習的假名
return gr.Tabs(selected=1), ...
先選擇要練習平假名、片假名
再選擇要練習哪幾排
把選出來的假名做個洗牌
透過 gr.State
紀錄測驗順序
如果使用者沒有選擇任何類別
可以透過 raise gr.Error()
來中斷函式進行
並顯示錯誤訊息
def start_test(...):
# 檢查使用者的選擇
if not char_list:
raise gr.Error("請至少選擇一個類別")
目前先透過 gr.Info
告訴使用者正確與否
def check_answer(...):
# 檢查使用者的答案
if correct:
return gr.Info("正確!")
else:
return gr.Info("錯誤,答案是 ...")
如果要確保函式參數的型別
通常會用 var: type
來標註
但這樣會讓參數列表看起來很長
def foo(a: list, b: dict, c: str):
a.pop()
b.items()
c.lower()
可以不在參數列表上標註型別
改用 cls.method(obj)
的方式呼叫方法
維持參數列表的精簡
def bar(a, b, c):
list.pop(a)
dict.items(b)
str.lower(c)
多數的元件觸發時只會呼叫一個函式
但 txt_input
會分別觸發「檢查假名」與「顯示下一題」
可以用 txt_input.submit(...).then(...)
來處理觸發順序