英語学習アプリ ①

別項の「今日の脳トレ」で間違えたものや調べたものなどをこのアプリで学習しております。

自分には随分と難しいアプリ開発でした。

まずどんなものかを絵で紹介します。

① 最初の図1の入力枠に学習する最初の文字を入力します(図では「s」)。

② OKをクリックすると図2へ移行します。入力枠は消えます。

③ 図③の「開始/次へ」をクリックすると、例では"s"で始まる単語が出題されます。

乱数で選ばれた英単語がクリックすると次々と出題されます。

このアプリの欠点は、別の先頭文字の単語(例ではs以外の単語)を学習するときは、
一旦アプリを終了して再開する必要があることです。

次回はその辺を修正します。

------------------------

図1

 

 

図2

 

 

図3

 

 

 

codeは次の通りです。 

 

1import tkinter as tk
2import random
3import textwrap
4import time
5import tkinter.simpledialog as sim
6 
7root = tk.Tk()
8root.geometry("500x340+50+180")
9root.title('新難解英単語')
10 
11font_word = font = ("Helevetica", 12, "bold")
12 
13lbl1 = tk.Label(text='英単語:', font=font_word)
14lbl1.place(x=10, y=30)
15lbl2 = tk.Label(text='意味:', font=font_word)
16lbl2.place(x=10, y=80)
17lbl3 = tk.Label(text='備考:', font=font_word)
18lbl3.place(x=10, y=130)
19lbl4 = tk.Label(root, font=font_word)  # 備考表示用
20lbl4.place(x=75, y=130)
21 
22lbl5 = tk.Label(
23    root, text="学習する単語の頭文字が選ばれました \n ⇚ ⇚ ⇚ ⇚ ⇚ ⇚ Allの場合は全単語。", font=font_word, bg="pink", )  # 備考表示用
24lbl5.place(x=130, y=200)
25 
26txt1 = tk.Entry(width=42, font=font_word, fg="red")  # 英単語
27txt1.place(x=75, y=30)
28txt2 = tk.Entry(width=42, font=("Helevetica", 12, "bold"))  # 意味
29txt2.place(x=75, y=80)
30 
31txt3 = tk.Entry(root, width=5, font=font_word, bg="pink", justify='center')
32txt3.place(x=50, y=205)
33txt3.delete(0, tk.END)
34 
35btn1 = tk.Button(root, width=10, text='開始/次へ',
36                 font=font_word, bg="light green")
37btn1.place(x=60, y=280)
38 
39btn3 = tk.Button(root, width=10, text='終わる',
40                 font=font_word, bg="light cyan")
41btn3.place(x=320, y=280)
42 
43 
44def destroy():
45    root.destroy()
46btn3["command"] = destroy
47 
48 
49first_letter = sim.askstring(
50    "ファイル選択", "単語の最初のアルファベット、又はallと記入して下さい。\n 入力エラーの場合は全単語を選びます", initialvalue="")
51if len(first_letter) >= 2 or len(first_letter) == 0:
52    first_letter = "all"
53txt3.insert(tk.END, first_letter)
54 
55 
56def get_filename():
57    first_letter = txt3.get()  #  この時点でtxt3にはalphabetが書き込まれている必要がある!
58    filename = first_letter + ".txt"
59    #filename = "./A-Z/" + first_letter + ".txt"
60    return filename
61filename = get_filename()
62 
63 
64def read_words():
65    #filename = "./A-Z/All.txt"
66    with open("All.txt", 'r', encoding='utf_8') as file:
67        line = file.readlines()
68 
69    line = [select for select in line if select.startswith(first_letter)]
70    #print(line)
71 
72    eitango_words = []  # 英単語list
73    imi_words = []  # 意味list
74    ref_words = []
75    line_count = 0  # 単語数カウンター
76 
77    for name in line:
78        name = name.rsplit("\t")  # tabで区切ったファイルの場合
79        if len(name) == 3:  # 要素3個をそれぞれのlistへ追加する
80            eitango_words.append(name[0])  # 英単語をlistへadd
81            imi_words.append(name[1])  # 意味をlistへadd
82            ref_words.append(name[2])  # 例文とかをlistへadd
83            line_count += 1
84 
85    return line_count, [eitango_words, imi_words, ref_words]
86 
87 
88def show_data(count, num, eitango_words, imi_words, ref_words):
89    eitango_word = eitango_words[num]
90    imi_word = imi_words[num]
91    ref_word = ref_words[num]
92 
93# ボタン1(開始/次)の関数
94    def show_tango(event):
95        # lbl5.place_forget()  # アルファベット選択の説明が終わったら一時offにする。
96        txt1.delete(0, tk.END)
97        txt2.delete(0, tk.END)
98        lbl4["text"] = ""
99 
100        num = random.randrange(0, count)
101        eitango_word = eitango_words[num]
102        txt1.insert(tk.END, eitango_word)
103 
104        def meaning(event):
105            imi_word = imi_words[num]
106            ref_word = ref_words[num]
107            txt2.insert(0, f' {imi_word}')
108            lbl4["text"] = ""
109            lbl4["text"] = ref_word
110 
111            message = textwrap.wrap(ref_word, 35)
112            ref = '\n'.join(message)
113            lbl4["text"] = ref
114        btn1.bind("<ButtonRelease>", meaning)
115    btn1.bind("<Button>", show_tango)
116 
117 
118count, words = read_words()
119eitango_words = words[0]
120imi_words = words[1]
121ref_words = words[2]
122num = random.randrange(0, count)
123show_data(count, num, eitango_words, imi_words, ref_words)
124 
125 
126root.mainloop()

 

 

 

 

Python別館
Python別館 目次

Pythonで作成したアプリ関連の記事は「Python別館」に、widgetやその使用方法・それを使 …

Python別館
Q&A テンプレート GUI編

良く英単語アプリなどを作る時に似たようなアプリになりますので、すぐ真似できるようにテンプレートらしき …

Python別館
文字列の配置

ラベル、テキストボックスなどで、文字列の配置が微妙に異なります。いつも迷うので基本的なものを挙げてお …