はじめに
フラッシュ暗記ができるプログラムを作りたい!
ということでpython3, Tkinterを用いてフラッシュ暗記プログラムを作成しました。
ソースコード
import tkinter as tk
from random import shuffle
import time
import threading
# ボタン関数
def button_pressed():
#配列をシャッフル
shuffle(label_list)
#シャッフルされたリストの要素を3秒ごと表示
for tmp in label_list:
var.set(tmp)
time.sleep(3)
var.set("")
# 別threadでボタン関数を動かす & ボタン削除
def m_thread():
thread1 = threading.Thread(target= button_pressed)
thread1.start()
#startボタン削除
button.destroy()
# テキストボックスとsubmitボタン
def txt_submit():
#テキスト取得
ans= txt.get()
#クリア
txt.delete(0,tk.END)
answer(ans)
# 答え合わせ
def answer(ans):
if ans in label_list:
label_list.remove(ans)
var2.set("正解! 残り "+str(len(label_list)))
else:
var2.set("不正解! 残り"+ str(len(label_list)))
#すべて正解時
if len(label_list)==0:
win.destroy()
# タイトル
win = tk.Tk()
win.title("Flash")
# ウィンドウサイズ
win.geometry("300x300")
# 表示内容配列(ここに表示したいものを入れる)
label_list = ["ホゲホゲ","アゲアゲ","Tkinter","Python","Flash"]
# 配列表示
var = tk.StringVar()
var.set("")
label =tk.Label(win,textvariable=var)
label.pack()
# 開始ボタンを作成
button = tk.Button(text="スタートする",command=m_thread)
button.pack()
# 答え入力テキストボックス
txt =tk.Entry(width = 30)
txt.pack()
# submitボタン
button2 = tk.Button(text="提出",command=txt_submit)
button2.pack()
# 正誤表示
var2= tk.StringVar()
var2.set("")
label2= tk.Label(win,textvariable=var2)
label2.pack()
win.mainloop()
部分的に説明
# 別threadでボタン関数を動かす
def m_thread():
thread1 = threading.Thread(target= button_pressed)
thread1.start()
ループで配列の中身を表示するbutton_pressed関数は別スレッドで処理しないと、ループの最後のみが現れ、動的にラベルが変更できません。よってthreadingを用いてbutton_pressed関数を別スレッドで処理しています。
# テキストボックスとsubmitボタン
def txt_submit():
#テキスト取得
ans= txt.get()
#クリア
txt.delete(0,tk.END)
この関数ではテキストボックスの中身を.get()でメソッドで取得し、.delete(0,tk.END)でテキストボックスの0番目から最後までの入力内容を削除(クリア)するようにしています。
# 配列表示
var = tk.StringVar()
var.set("")
label =tk.Label(win,textvariable=var)
label.pack()
動的に表示したいラベルはすべてStringVarを用いています。
最後に
わからない部分は参考資料が詳しく説明してあるのでそこを見てください。
参考資料
以下の資料を参考にさせていただきました。
[1] https://www.delftstack.com/ja/howto/python-tkinter/how-to-change-the-tkinter-label-text/
[2] https://qiita.com/__init__/items/74b36eba31ccbc0364ed
[3] https://teratail.com/questions/286182
[4] https://qiita.com/shimajiri/items/3f23f34bd3a799a6702d