【Python】Tkinterを使った英単語暗記アプリ

PythonTkinter(ティーキンター)で英単語の勉強ができるアプリを自作しました。

  • 隙間時間に・・・
  • 死ぬほどつまらない会議の裏で・・・

などなど、自己責任でご利用ください。

なんでこれを作ったか

これを作った時、仕事が死ぬほど暇だったんですよね。

業務で英語を使うので勉強したいなとは思っていたのですが、 かといって大っぴらにWebや既存アプリで勉強するのも憚れるし・・・

ということで、自分でこっそりアプリを作ればいいんじゃね?となりました。

アプリ自作のメリットは、主に以下の2点です。

  • ウィンドウサイズを小さくできるので、同僚にばれにくい。
  • 自分の好きな単語をセットできる。

Pythonの勉強もできるし一石二鳥ですね。

GUI

PythonGUIを設ける方法はいくつかあるようですが、とりあえず簡易的なアプリができればよいのでTkinterにしました。 何かをインストールする必要もなく、importすればOKなのでらくちんです。

アプリの流れ

やりたいことは以下の3点です。

  • 英単語をランダムに表示する。
  • 「SHOW」ボタンを押すと日本語訳を表示する。
  • 「○」「×」ボタンを押すと結果をcsvに記録して、次の問題に進む。

準備するものは、英単語リストですが、これはネットに落ちているものを適当に持ってきました。グレーなのでリンクは貼りません。。

仕事でわからなかった単語などを追加していきたいです。

コード

import csv
import tkinter as tk
import random


### 関数 ###
#CSV読み込み
def read_csv(filename):
    f = open(filename, "r")
    csv_data = csv.reader(f)
    list = [ e for e in csv_data]
    f.close()
    return list

#CSV書き込み
def write_csv(filename, list):
   with open(filename, 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerows(list)   #書き込み
   f.close()

#結果計算
def calcTry(list,i,judge):
    k=i.get()
    if(judge==1):
        print(str(k)+" ○")  #問題番号と正誤を出力
    else:
        print(str(k)+" ×")
    beforeTryNum=int(list[k][2])    #試行回数
    beforeCorrectNum=int(list[k][3])    #正解回数
    list[k][2]=beforeTryNum+1   #試行回数+1
    list[k][3]=beforeCorrectNum+judge   #正解回数+judge

#次の問題表示
def nextQuiz(list,i,enArea,jpArea):
    i.set(random.randint(0, len(list)-1))   #次の問題をランダムに選択
    k=i.get()
    enArea["text"] = list[k][0] #英語表示
    jpArea["text"] = "" #日本語消去


## ボタン用関数 ##
#ボタンを押すと、日本語が見える
def showAnswer(list,i,jpArea):
    k=i.get()
    jpArea["text"] = list[k][1] #日本語を表示

#正解or不正解ボタン
def sendAnswer(filename,list,i,enArea,jpArea,judge):
    calcTry(list,i,judge)   #計算へ。judge:1=正解、0=不正解
    write_csv(filename, list)   #csv書き込み
    nextQuiz(list,i,enArea,jpArea)  #次の問題へ


### MAIN ###

### ファイル読み込み ###
file_path ="C:\\Users\\任意のパス" 
inputfile = file_path + "\\任意のファイル名.csv"      #csvファイル

csv_data = read_csv(inputfile)


### ポップアップGUI ###
root = tk.Tk()  #ウィンドウを作る
root.title("TRAINING")
root.geometry("210x120")


#ランダム値をセット
i = tk.IntVar()
i.set(random.randint(0, len(csv_data)-1))
k=i.get()


### ③画面の項目をそれぞれ作成 ###
#英語表示エリア
enArea = tk.Label(root,wraplength=90, text=csv_data[k][0])
enArea.place(x=10, y=10)

#日本語表示エリア
jpArea = tk.Label(root,wraplength=90, text="")
jpArea.place(x=110, y=10)

#回答表示ボタン
btnShowAnswer = tk.Button(root, text="SHOW", width="9", command=lambda:showAnswer(csv_data,i,jpArea))
btnShowAnswer.place(x=10, y=80)

#正解時押下ボタン
btnCorrectAnswer = tk.Button(root, text="○", width="4", command=lambda:sendAnswer(inputfile,csv_data,i,enArea,jpArea,1))
btnCorrectAnswer.place(x=110, y=80)

#不正解時押下ボタン
btnWrongAnswer = tk.Button(root, text="×", width="4", command=lambda:sendAnswer(inputfile,csv_data,i,enArea,jpArea,0))
btnWrongAnswer.place(x=160, y=80)


root.mainloop()

実際のアプリはこんな感じ

プログラム実行するとアプリが立ち上がり、ランダムな英単語が表示されます。

アプリ画面1

「SHOW」ボタンを押すと右側に日本語訳が表示されます。自分の思った答えと同じなら「○」、違っていたら「×」を押して次の問題へ進みます。

アプリ画面2

CSVはこんな感じです。左から、「英単語」「日本語訳」「試行回数」「正答回数」です。出題はランダムなので試行0のものもありますね。

CSVファイル

今後

このアプリは暇だった時にサクッと作ったものなので、今後改良していきたいですね。

例えば、

  • ある程度正答したら出題しないようにする。
  • 単語だけではなく例文も表示する。

などです。