脳トレの勧め 2/2

前回は、辞書に三つの要素を入れる術が分からなかったので、策を弄して取敢えずは動くように出来ました。
でも何となく乱数で飛び飛びに選択するというのが、気持ち悪いので今回は次のようにしました。

1.データをテキストファイルとして準備する(文字列読込1.txt)
2.それをread_word()関数で変数に読み込む
3.Nextボタンで乱数で単語・意味・備考を表示させる

という形でプログラムしました。

 
# 難解英単語クイズ(data3要素は別file)2.py  
 
import tkinter as tk
import random
import textwrap  # 文字列折り返し用

root = tk.Tk()

root.geometry(‘350×300’)
root.title(‘難解英単語’)

lbl1 = tk.Label(text=’英単語:’)
lbl1.place(x=10, y=30)
lbl2 = tk.Label(text=’意味:’)
lbl2.place(x=10, y=80)
lbl3 = tk.Label(text=’備考:’)
lbl3.place(x=10, y=130)
lbl4 = tk.Label(root)  # 備考表示用
lbl4.place(x=60, y=130)

txt1 = tk.Entry(width=27, font=(“Helevetica”, 12, “bold”), fg=”red”)  # 英単語
txt1.place(x=60, y=30)
txt2 = tk.Entry(width=40)  # 意味
txt2.place(x=60, y=80)

btn1 = tk.Button(root, text=’開始/次へ’)
btn1.place(x=60, y=230)

def read_words():
    with open(‘文字列読込1.txt’, ‘r’, encoding=’utf_8′) as file:
        line = file.readlines()

    eitango_words = []  # 英単語list
    imi_words = []  # 意味list
    ref_words = []

    line_count = 0  # 単語数カウンター

    for name in line:
        name = name.rsplit(“\t”)  # tabで区切ったファイルの場合
        if len(name) == 3:  # 要素3個をそれぞれのlistへ追加する
            eitango_words.append(name[0])  # 英単語をlistへadd
            imi_words.append(name[1])  # 意味をlistへadd
            ref_words.append(name[2])
            line_count += 1
            # print(line_count)
    # txtがなくなるまで繰り返す
    return line_count, [eitango_words, imi_words, ref_words]

def show_data(count, num, eitango_words, imi_words, ref_words):  # 乱数に応じた要素を表示する関数
    eitango_word = eitango_words[num]  # 英単語をeitango_wordに格納
    imi_word = imi_words[num]
    ref_word = ref_words[num]

   # ボタン1(開始/次)の関数
    def show_tang(event):
        txt1.delete(0, tk.END)
        txt2.delete(0, tk.END)  # textの消し方がラベルとテキストボックスでは異なる
        lbl4[“text”] = “”

        num = random.randrange(0, count)
        # print(f’num={num}’) #変数numの表示
        eitango_word = eitango_words[num]  # eitango_wordに格納
        txt1.insert(0, f’ {eitango_word}’)

        def meaning(event):
            txt2.delete(0, tk.END)
            imi_word = imi_words[num]
            ref_word = ref_words[num]
            # txt1.insert(tk.END, eitango_word)でもOK
            txt2.insert(0, f’ {imi_word}’)
            lbl4[“text”] = “”
            lbl4[“text”] = ref_word

            message = textwrap.wrap(ref_word, 35)
            ref = ‘\n’.join(message)
            lbl4[“text”] = ref
        btn2.bind(“<Button>”, meaning)

    btn1.bind(“<Button>”, show_tang)

count, words = read_words()
print(“line 86: “, count)
eitango_words = words[0]
imi_words = words[1]
ref_words = words[2]

num = random.randrange(0, count)
show_data(count, num, eitango_words, imi_words, ref_words)

def destroy():
    root.destroy()

btn2 = tk.Button(root, text=”意味・備考”)
btn2.place(x=150, y=230)

btn3 = tk.Button(root, text=’終わる’, command=destroy)
btn3.place(x=250, y=230)

root.mainloop()

 

勿論結果も前回と同じようになります。

 

 

終わり

 

 

Python別館
Python別館 目次

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

Python別館
脳トレの勧め 1/2

朝一番で頭の体操と称して英単語のクイズをやっております(ここです)。ここで間違えたものや、大事そうな …

Python別館
辞書から回文英単語を探そう

「竹藪焼けた」、「磨かぬカガミ」とか後ろから読んでも同じになるものを「回文」と云います。日本語のそれ …