機能追加(3)同じ単語が続く問題への対応
(Python学習初心者の試行錯誤・備忘録です)
グラフで「見える化」すると、アプリの「間抜け」な動作が目についてきます。学習が進んで、記憶定着レベルがだいぶ上がってきたときに、たまたま一つど忘れしてしまうと
「覚えた」
「覚えた」
と同じ単語ばかり続けて出てきてしまいます。出題の優先順位は、「習熟レベルが低い順」で「タイムスタンプが古い順」
>ORDER BY level ASC, timestamp ASC
としているからです。これを避けるために、指定したレベル以上の単語だけから出題するように改造します。
実は、そのうち、そんなこともあろうかと、カードを選ぶ関数
def pickupcard(self, lowerlevel=0) -> None:
self.mycards.select_topcard_where("level >= ? \
ORDER BY level ASC, timestamp ASC ",(lowerlevel,))
で抽出時の「最低レベル」を指定できるようにしてありました。
Viewのレイアウトに「最低レベル」の選択を追加します。
layout = [
[eg.Menu(menu_def)],
[eg.Combo(values=["zh-TW","ja","en-US"],default_value="zh-TW",key="-LANG-"),
eg.Text("次のレベル以上を練習"),
eg.Combo(values=[0,1,2,3],default_value=0,key="-LEVEL-", enable_events=True),
eg.Text("デザインテーマ"),eg.Combo(values=themelist,default_value=self.mytheme,
key="-THEME-",enable_events=True)],
[eg.Canvas(key='-CANVAS-',size=(800,180))], #グラフ表示の追加
[eg.Button("発声", font = btfont, key ="-BTN_SPEAK-"),
eg.Button("連想", font = btfont, key ="-BTN_SHOW_BACK-"),
eg.Button("覚えた", font = btfont, key ="-BTN_MEMORIZE-"),
eg.Button("まだ", font = btfont, key ="-BTN_FORGET-")],
[eg.Text('サマリー仮置き',
key="-DISP_SUMMARY-",font=('Arial', 15))],
[eg.Text(myword, font = lfont, key="-DISP_MAIN-")],
[eg.Text(pinyin, font = sfont, key="-DISP_SUB-")],
]
メインのコードで、LEVELが変更された時のイベント処理を追加します。
elif event == "-LEVEL-":
mycontroller.pickupcard(value["-LEVEL-"])
mycontroller.refresh_view(myview)
「次のレベル以上を練習」と言うコンボボックスでレベルを選択できます。対象が存在しないとき(たとえばすべての単語がレベル0なのに、レベル2以上を選んだ時など)はNoneと表示されます。これは、コントローラーのrefresh_view()関数の中で
def refresh_view(self,myview):
myview.showgraph(self.levelcount[0],self.levelcount[1],self.levelcount[2],\
self.levelcount[3],self.levelcount[4])
myview.window["-DISP_SUMMARY-"].update("レベル0:{}個 レベル1:{}個 レベル2:{}個 レベル3:{}個 合計 {}個"\
.format(self.levelcount[0],self.levelcount[1],self.levelcount[2],\
self.levelcount[3],self.levelcount[4]))
myview.window["-TEXT_DBNAME-"].update(self.mycards.mydb)
if self.mycards.topcard is not None:
myview.window["-DISP_MAIN-"].update(self.mycards.topcard['face'])
myview.window["-DISP_SUB-"].update("")
else:
myview.window["-DISP_MAIN-"].update("None")
myview.window["-DISP_SUB-"].update("None")
対象カードが見つからなかったときにメイン・サブ表示部にNoneと表示するようにしたためです。