英語学習アプリ ①

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

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

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

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

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

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

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

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

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

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

図1

 

 

図2

 

 

図3

 

 

 

codeは次の通りです。 

 

1 import tkinter as tk
2 import random
3 import textwrap
4 import time
5 import tkinter.simpledialog as sim
6  
7 root = tk.Tk()
8 root.geometry("500x340+50+180")
9 root.title('新難解英単語')
10  
11 font_word = font = ("Helevetica", 12, "bold")
12  
13 lbl1 = tk.Label(text='英単語:', font=font_word)
14 lbl1.place(x=10, y=30)
15 lbl2 = tk.Label(text='意味:', font=font_word)
16 lbl2.place(x=10, y=80)
17 lbl3 = tk.Label(text='備考:', font=font_word)
18 lbl3.place(x=10, y=130)
19 lbl4 = tk.Label(root, font=font_word)  # 備考表示用
20 lbl4.place(x=75, y=130)
21  
22 lbl5 = tk.Label(
23     root, text="学習する単語の頭文字が選ばれました \n ⇚ ⇚ ⇚ ⇚ ⇚ ⇚ Allの場合は全単語。", font=font_word, bg="pink", )  # 備考表示用
24 lbl5.place(x=130, y=200)
25  
26 txt1 = tk.Entry(width=42, font=font_word, fg="red")  # 英単語
27 txt1.place(x=75, y=30)
28 txt2 = tk.Entry(width=42, font=("Helevetica", 12, "bold"))  # 意味
29 txt2.place(x=75, y=80)
30  
31 txt3 = tk.Entry(root, width=5, font=font_word, bg="pink", justify='center')
32 txt3.place(x=50, y=205)
33 txt3.delete(0, tk.END)
34  
35 btn1 = tk.Button(root, width=10, text='開始/次へ',
36                  font=font_word, bg="light green")
37 btn1.place(x=60, y=280)
38  
39 btn3 = tk.Button(root, width=10, text='終わる',
40                  font=font_word, bg="light cyan")
41 btn3.place(x=320, y=280)
42  
43  
44 def destroy():
45     root.destroy()
46 btn3["command"] = destroy
47  
48  
49 first_letter = sim.askstring(
50     "ファイル選択", "単語の最初のアルファベット、又はallと記入して下さい。\n 入力エラーの場合は全単語を選びます", initialvalue="")
51 if len(first_letter) >= 2 or len(first_letter) == 0:
52     first_letter = "all"
53 txt3.insert(tk.END, first_letter)
54  
55  
56 def get_filename():
57     first_letter = txt3.get()  #  この時点でtxt3にはalphabetが書き込まれている必要がある!
58     filename = first_letter + ".txt"
59     #filename = "./A-Z/" + first_letter + ".txt"
60     return filename
61 filename = get_filename()
62  
63  
64 def 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  
88 def 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  
118 count, words = read_words()
119 eitango_words = words[0]
120 imi_words = words[1]
121 ref_words = words[2]
122 num = random.randrange(0, count)
123 show_data(count, num, eitango_words, imi_words, ref_words)
124  
125  
126 root.mainloop()

 

 

 

 

Python別館
Python別館 目次

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

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

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

Python別館
文字列の配置

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