Q&A テンプレート GUI編

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

****************************************************************

 

Q&A テンプレート ー 英単語

1.必要ライブラリー: tkinter, random
2.データ:要素は三個、区切りはtabでtxtファイルを準備
3.必要widget:label、entry、text、button
4.codeの説明:
・必要ライブラリーをimportする
・必要widgetを配置する
・全ファイルを読み込む(ファイル行数をcountとする)
・要素名のlistを作る
・そのlistに全要素を格納する
・ボタン1クリック(押した状態)で、乱数に応じた要素1をentry1に表示する
・ボタン1を離すと、先に表示(記憶)された要素をクリアーしその後に乱数に応じた要素2,3をentry2、text1表示する ーー ボタン1解放でこの処理が行われる
・この処理は「終わり」ボタンがクリックされるまで続けられる
・「終わり」ボタンで終了する

このテンプレートを案として、英単語アプリを作るとcodeは次のようになる。

# 脳トレ英単語.py  6/28/2021

import tkinter as tk
import random

root = tk.Tk()

root.geometry('480x360')
root.title('脳トレ英単語')

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)

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

txt4 =tk.Text(root, width=40, height=5, font=font_word)
txt4.place(x=75, y=150)

btn1 = tk.Button(root, width=15, text='開始/次へ', font=font_word)
btn1.place(x=40, y=280)

class Do():
    def read_words():
        with open("脳トレ.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])  # 例文とかを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):
            txt1.delete(0, tk.END)
            txt2.delete(0, tk.END)
            txt4.delete('1.0', 'end')
            #txt4.delete(0, tk.END) # これはerror!

            num = random.randrange(0, count)
            eitango_word = eitango_words[num]
            txt1.insert(tk.END, f'{eitango_word}')
            #txt1.insert('1.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(tk.END, f'{imi_word}')
                txt4.insert(tk.END, f'{ref_word}')
            btn1.bind("<ButtonRelease>", meaning)
        btn1.bind("<Button>", show_tango)

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

    btn3 = tk.Button(root, width=15, text='終わる',
                     font=font_word, command=destroy)
    btn3.place(x=270, y=280)

Do()

root.mainloop()

 

テンプレートに実際のcodeを書くと、次のようになります。

 

 

 

Python別館
Python別館 目次

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

Python別館
文字列の配置

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

Python別館
csvファイルの呼び込み

普段は文字列にコンマ(,)が入ったtxtファイルでのアプリが多いのですが、今回はコンマ区切りのcsv …