orz

趣味のブログです

3万語の英語クイズで英単語を覚える(Python)

前書き

PythonGUI機能を使いまして、英語のクイズが作れないかやってみました。
GUIの勉強になってよかったです(小並感)。

プログラムの設計

英単語の取得

以下のリンクから、エクセルファイルを取得してきました。
www.jamsystem.com
こいつをベースに英単語クイズを作ります。

コード書く前に考える

以下のプロトコルでできないか考えました。

  • 4つの乱数を生成させる
  • その乱数群から1つ選んで、出題する英単語を無作為に選ぶ
  • 乱数群をシャッフルして、その乱数4つに対応する英単語の日本語の意味を抜き出して表示させる。
  • 4つの乱数群から選択した数字が出題につかった乱数と合っているか判別する

具体化させますと、
乱数[1,2,3,4]を発生させます。それに対応する英単語が[a,b,c,d]だとします。
英単語[a,b,c,d]に対応する日本語の意味が[あ、い、う、え]だとします。
その中から、例えば"1"を選びます。
英単語リストの1番を選んで"a"を出題させる。
乱数[1,2,3,4]の並びを[4,3,2,1]として、出題文として[え、う、い、あ]が出る。

これを繰り返せば、何度もクイズができると想定してコーディングしてみました。

間違えた問題は、エクセルに書き込んで後で復習できるようにします。

ソースコード

import tkinter
import numpy as np
import random 
import time
import xlrd 
import datetime
import openpyxl as px
#エクセルを読み込むセクション
wb = xlrd.open_workbook('./ANC30000_1014_Dic.xls')
#'Japanise+'のシートをアクティブにする
sheet = wb.sheet_by_name('Japanese+')
now = datetime.datetime.now()
filename = now.year*10000 + now.month*100 + now.day
filename = str(filename)
filename += "english_machigai.xlsx"
#間違いを記録するエクセル
try:
    wb_e = px.load_workbook(filename)
except:
    wb_e = px.Workbook()
ws1 = wb_e['Sheet']
ws1["A1"].value = "間違えた単語"
ws1["B1"].value = "間違えた単語の日本語の意味"
ws1["C1"].value = "間違えた単語の解説"
r_e = ws1.max_row
#イベントボタンのセクション
##使う変数を定義。出題エクセルの行数、出題に使う乱数(a, t), 問題文(question), 出題数と間違いのカウント(count, error)
r_max = sheet.nrows
a = np.random.randint(3, r_max, (1, 4))
t = np.random.choice(a[0])
question = sheet.cell(t,0).value
count = 0
error = 0

#更新ボタン
#こいつが実行されると、問題文が更新される
def btn_click():
    global tki
    global a
    global t
    global questios
    a = np.random.randint(3, r_max, (1, 4))
    t = np.random.choice(a[0])
    question = sheet.cell(t,0).value
    random.shuffle(a[0])
    btn_1.configure(text=sheet.cell(a[0][0],3).value,command = btn_click_n1)
    btn_2.configure(text=sheet.cell(a[0][1],3).value,command = btn_click_n2)
    btn_3.configure(text=sheet.cell(a[0][2],3).value,command = btn_click_n3)
    btn_4.configure(text=sheet.cell(a[0][3],3).value,command = btn_click_n4)
    lbl_q.config(text = "問題: "+str(question)+"の意味はどれでしょう?")

#ボタンの入力に応じて正解かどうかを判断したいが、なぜか起動するとすでに実行されている<=引数が入っているとダメ見たいですね。。なんでやろ
def ans(num):
    global tki
    global a 
    global t   
    global r_e
    global error
    global count 
    count += 1
    if a[0][num] == t:
        print ("正解です")
    else:
        r_e += 1
        error += 1
        print ("不正解です")
        print ("正解は",sheet.cell(t,3).value,"です\n間違えたのでエクセルに書き込みました")
        ws1["A"+str(r_e)].value = sheet.cell(t,0).value
        ws1["B"+str(r_e)].value = sheet.cell(t,3).value
        ws1["C"+str(r_e)].value = sheet.cell(t,4).value
        wb_e.save(filename)
    btn_click()

#ボタン1~4がクリックされたときに実行される関数
def btn_click_n1():
    ans(0)
def btn_click_n2():
    ans(1)
def btn_click_n3():
    ans(2)
def btn_click_n4():
    ans(3)

count = 0
error = 0
tki = tkinter.Tk()
tki.geometry('300x300')
tki.title('英単語を覚えるアプリ')

# ラベル(出題問題の)
lbl_q = tkinter.Label(text ="問題: "+question+"の意味はどれでしょう?")
lbl_q.place (x=80, y =50)
# テキストボックス

btn_1 = tkinter.Button(tki,text=sheet.cell(a[0][0],3).value,command=btn_click_n1)
btn_1.place(x=90, y=100)
#btn_1.pack()
btn_2 = tkinter.Button(tki,text=sheet.cell(a[0][1],3).value,command=btn_click_n2)
btn_2.place(x=180, y=100)
#btn_2.pack()
btn_3 = tkinter.Button(tki,text=sheet.cell(a[0][2],3).value,command=btn_click_n3)
btn_3.place(x=90, y=150)
#btn_3.pack()
btn_4 = tkinter.Button(tki,text=sheet.cell(a[0][3],3).value,command=btn_click_n4)
btn_4.place(x=180, y=150)
#btn_4.pack()
# 更新ボタン


# 画面をそのまま表示
tki.mainloop()
print (count,"回のクイズに挑戦して正解率は",error,"/",count,"でした")

実行結果

下のようなGUIが実行されまして、結果はこんな感じになります。
f:id:orshibuya0926:20210207082952p:plain
プログラムがあるディレクトリに、"今日の日付"+machigai.xlsxが生成されまして、間違えた英単語、その日本語訳と解説がどんどん記入されていきます。

余談

btn_1 = tkinter.Button(tki,text=sheet.cell(a[0][0],3).value,command=btn_click_n1)

この部分で、引数が入っているとすぐに関数が実行されるのは謎です。。。
初学者なので理由はわかりません。

次の課題

  • 中国語などの違う言語でのクイズの作成