前提
Pythonで「英単語四択問題アプリ」を作ってますが、下記諸問題があり行き詰っております。
解決案の示唆でも結構ですので宜しくお願い致します。
実現したいこと
下記問題点を解決したい:
・正解の選択肢の位置をバラバラにしたい(現在は常にラジオボタン①になってしまう)
・nextボタンで次の問題を出せるようにしたい。---> クラス仕様が良いのかもしれません。
・次の問題・選択肢を表示させると、前の表示が長い場合に残滓がでる(deleteなどでも消せない)
・現在の成績を出したい(出題数と正解数が分かればよい)
・最終的には今後の応用を考えclassで書き直したい
発生している問題・エラーメッセージ
・正解の選択肢の位置をバラバラにしたい。
・nextボタンで次の問題を出せるようにしたい。
・次の問題・選択肢を表示させると、前の表示が長い場合に残滓がでる
・現在の成績を出したい(出題数と正解数が分かればよい)
・最終的には今後の応用を考えclassで書き直したい
エラーメッセージ
現在の処理方法ではエラーはありません。
該当のソースコード
import csv
import random
import tkinter as tk
import datetime
root=tk.Tk()
root.title("英単語四択Q&A")
root.geometry("380x400")
now = datetime.datetime.now()
day = now.date().strftime('%m/%d/%Y')
lbl_1=tk.Label(text=day)
lbl_1.place(x=300,y=10)
lbl_2=tk.Label(text="英単語問題:")
lbl_2.place(x=10,y=40)
lbl_3=tk.Label(text="正誤判定:")
lbl_3.place(x=10,y=230)
lbl_4=tk.Label(text="備考:")
lbl_4.place(x=10,y=260)
lbl_5=tk.Label(text="現在の成績:")
lbl_5.place(x=10,y=290)
frame_1=tk.LabelFrame(root,text="選択肢", width=350, height=150)
frame_1.place(x=15, y=70)
lbl_11=tk.Label(text=" ver 1.1")
lbl_11.place(x=320,y=350)
txt_1=tk.Entry(width=40) # 英単語問題表示
txt_1.place(x=90,y=40)
txt_2=tk.Entry(width=47) # 正誤判定表示
txt_2.place(x=75,y=230)
txt_3=tk.Entry(width=51) # 備考 未完
txt_3.insert(tk.END, " 検討中")
txt_3.place(x=50,y=260)
txt_4=tk.Entry(width=45) # 現在の成績 未完
txt_4.insert(tk.END, " 検討中")
txt_4.place(x=87,y=290)
selected_elements = [] #全データ用入れ物
path = '英単語試験100ver3.csv'
with open(path) as f:
reader = csv.reader(f)
for selected_elements in reader:
selected_elements.append(selected_elements)
問題集ファイル(csv)の読み込み。1行目はヘッダなので読み込まない。
path = '英単語試験100ver3.csv'
test_file = open(path)
test_data = csv.reader(test_file)
all_elements = [] #全データ用入れ物
for row in test_data: # test_dataをrowに入れる
if test_data.line_num == 1: #タイトル行は読まずに続ける
continue
all_elements .append(row) #入れ物に全データを収納する
test_file.close() # 100行を読み込むとcloseされる
#print("all_elements : ", all_elements )#リストの中身は、100個の小リストが格納されている
selected_elements = random.sample(all_elements, 5) # 5個の英単語群が得られる
#print("選択された単語番号,英単語,意味の小リスト: ", selected_elements[0]) # ['42', 'gaunt\u3000', 'やせた']
#print("単語番号: ", selected_elements[0][0]) # 42 - この数字を合否判定に使う
#print("英単語: ", selected_elements[0][1]) # gaunt
txt_1.delete(0, tk.END)
txt_1.insert(tk.END, ' ' + selected_elements[0][1]) # 質問用英単語表示
#print(txt_1.get())#確認のためtxt_1の表示文字を確認する #gaunt OK
var = tk.IntVar()#int の値を保持するオブジェクトを作成。 IntVar は Variable クラスのサブクラス。
var.set(5) # ダミー(他の選択肢が非選択となるようにする)
var.get()
selected_radio = random.sample(range(1,6), k=5)#乱数で以下の様な、五個(k)のデータリストの順番用数字をgetする
#print("要素五個のリスト: ", selected_radio)#[1, 5, 3, 4, 2] 選択肢の順序を乱数で並び変えるには??
txt_1.delete(0, tk.END)
txt_1.insert(tk.END, ' ' + selected_elements[0][1]) #英単語表示
#ラジオボタンの動的配置 どのボタンも選択されていない(枠外のvar.set(5)に設定してあるため)
for i in range(5):
radiobutton = tk.Radiobutton(frame_1, value=i, variable=var, text=selected_elements[i][2]).place(x=0, y=i*25)
def evaluate():
num = var.get()#押されたラジオボタンの番号を格納する
txt_2.delete(0, tk.END)
print("radioBuon No. :", num)#押されたラジオボタンの番号を表示する
if num == 0:#最初のラジオボタンが押された場合
txt_2.insert(tk.END, ' 正解: ' + selected_elements[num][2])
else:#最初のラジオボタン以外が押された場合
txt_2.insert(tk.END, ' 残念、不正解です、もう一度頑張ってね。' )
def next():
var.set(5)
txt_1.delete(0, tk.END)
txt_2.delete(0, tk.END)
pass # 最初に戻る処理を考慮中
btn_1=tk.Button(root, text="評価", command=evaluate)
btn_1.place(x=80, y=350)
btn_2=tk.Button(root, text="次へ", command=next)
btn_2.place(x=150, y=350)
btn_3=tk.Button(root, text="終わり", command=root.destroy)
btn_3.place(x=220, y=350)
root.mainloop()
Python 3.10.4
windows10
試したこと
・正解の選択肢の位置をバラバラにしたい:
radiobuttonへの書き込み(text)をshuffleしても、正解肢が必ず最初のラジオボタンになります。
・次の問題・選択肢を表示させると、前の表示が長い場合に残滓がでる:
delete、destroyなどで試しましたが上手くいきませんでした
・成績評価やクラス移行は未検討です。
補足情報(FW/ツールのバージョンなど)
editorはPython付属のIDLEです
ここにより詳細な情報を記載してください。
このアプリで使用している英単語fileをテンプします。
まだ回答がついていません
会員登録して回答してみよう