乱数でabc別に単語を覚えよう

Python

数年前に作ったアプリを少し修正しようとしてますが、すっかり忘れてしまったのでここへあげてしげしげと眺めて学習し直しをします。 

# 英単語(乱数でabc 5_30_2022).py   530/2022
#UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 8: invalid start byte
#   上のエラーが出る場合は、with open("All_232.txt") as file: とする 

import string
import tkinter as tk
import random
import textwrap


root = tk.Tk()
root.geometry("500x340+50+180")
root.resizable(0,0) # x,yのサイズ変更不可
root.title('新難解英単語')
root.option_add('*font', ('FixedSys', 14))

font_word = font = ("Helevetica", 12, "bold")

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


txt1 = tk.Entry(width=42, font=font_word, fg="red")  # 英単語
txt1.place(x=75, y=30)
txt2 = tk.Entry(width=42, font=font_word)  # 意味
txt2.place(x=75, y=80)

txt3 = tk.Entry(root, width=5, font=("Helevetica", 14, "bold"),
                bg="pink", justify='center', relief="flat")
txt3.place(x=65, y=205)
txt3.delete(0, tk.END)

btn1 = tk.Button(root, width=10, text='開始/次へ',
                 font=font_word, bg="light green")
btn1.place(x=60, y=280)

btn2 = tk.Button(root, width=10, text='別のabc',

                 font=font_word, bg="lightblue")
btn2.place(x=190, y=280)

btn3 = tk.Button(root, width=10, text='終わる',
                 font=font_word, bg="light cyan")
btn3.place(x=320, y=280)


lbl5 = tk.Label(
    root, text="  で始まる英単語が選ばれました。", font=font_word, bg="pink", relief="flat")  # 備考表示用
lbl5.place(x=115, y=205)


def read_words():
    txt3.delete(0, tk.END)
    with open("All_232.txt") as file: #, 'r', encoding='utf_8') as file:
        line = file.readlines()  # 全単語リスト

     # 乱数でa~zを選ぶ。全て小文字に変換される
    i = random.randint(0, 25)
    first_letter = string.ascii_letters[i]
    txt3.insert(tk.END, first_letter)  # そのアルファベットをfirst_letterとしてtxt3に書き込む
    first_letter = txt3.get()
    #print("line 65: ", first_letter)
    # 全単語リストより、最初の文字の文字の単語だけを改めてlineリストに格納する
    line = [select for select in line if select.startswith(first_letter)]

    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])  # 例文とかをlistへadd
            line_count += 1

    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]
    imi_word = imi_words[num]
    ref_word = ref_words[num]

# ボタン1(開始/次)の関数
    def show_tango(event):
        # lbl5.place_forget()  # アルファベット選択の説明が終わったら一時offにする。
        txt1.delete(0, tk.END)
        txt2.delete(0, tk.END)
        lbl4["text"] = ""

        num = random.randrange(0, count)
        eitango_word = " " + eitango_words[num]
        txt1.insert(tk.END, eitango_word)

        def meaning(event):
            imi_word = imi_words[num]
            ref_word = ref_words[num]
            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
        btn1.bind("<ButtonRelease>", meaning)
    btn1.bind("<Button>", show_tango)


count, words = read_words()
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)

# もう一度abcを選び直す
def again():
    txt3.delete(0, tk.END)
    i = random.randint(0, 25)
    first_letter = string.ascii_letters[i]
    txt3.insert(tk.END, first_letter)  # そのアルファベットをfirst_letterとしてtxt3に書き込む
    first_letter = txt3.get()
    print(first_letter)
    count, words = read_words()
    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)

    txt1.delete(0, tk.END)
    txt2.delete(0, tk.END)
    lbl4["text"] = ""


btn2["command"] = again


def destroy():
    root.destroy()


btn3["command"] = destroy

root.mainloop()

コメント