【Python】Tkinterを使った英単語暗記アプリ
Python+Tkinter(ティーキンター)で英単語の勉強ができるアプリを自作しました。
- 隙間時間に・・・
- 死ぬほどつまらない会議の裏で・・・
などなど、自己責任でご利用ください。
なんでこれを作ったか
これを作った時、仕事が死ぬほど暇だったんですよね。
業務で英語を使うので勉強したいなとは思っていたのですが、 かといって大っぴらにWebや既存アプリで勉強するのも憚れるし・・・
ということで、自分でこっそりアプリを作ればいいんじゃね?となりました。
アプリ自作のメリットは、主に以下の2点です。
- ウィンドウサイズを小さくできるので、同僚にばれにくい。
- 自分の好きな単語をセットできる。
Pythonの勉強もできるし一石二鳥ですね。
GUI
PythonでGUIを設ける方法はいくつかあるようですが、とりあえず簡易的なアプリができればよいので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()
実際のアプリはこんな感じ
プログラム実行するとアプリが立ち上がり、ランダムな英単語が表示されます。
「SHOW」ボタンを押すと右側に日本語訳が表示されます。自分の思った答えと同じなら「○」、違っていたら「×」を押して次の問題へ進みます。
CSVはこんな感じです。左から、「英単語」「日本語訳」「試行回数」「正答回数」です。出題はランダムなので試行0のものもありますね。
今後
このアプリは暇だった時にサクッと作ったものなので、今後改良していきたいですね。
例えば、
- ある程度正答したら出題しないようにする。
- 単語だけではなく例文も表示する。
などです。