前提・実現したいこと
python3でクイズプログラムの作成を行っています。
1.取り込んだcsvから、問題に使う植物Aをランダムに選択
2.Aと同じ科の植物の中から別のひとつBを選択(答えとなる)
3.Aと異なる科の植物の中から3つを選択(C,D,E)
4.「Aと同じ科の植物はどれか選べ」という問題に
B,C,D,Eの選択肢を提示する
5.回答を選んで答え合わせボタンを押すと、正解不正解を表示
6.OKボタンを押すと再び1.に戻って新たな問題が表示される
というプログラムを想定しています。
みなさんのご指導のおかげで5までは実現できたのですが、
6の処理で三度行き詰ってしまいました。
1~4の処理をひとつの関数にまとめて、ボタンクリックイベントの下につけるという
発想がナンセンスなのでしょうか?連日恐縮ですがご教示ください。
該当のソースコード
python3.8.0
1import random 2import csv 3import tkinter, tkinter.messagebox 4 5# 問題のもととなるcsvファイルを読み込み 6# csvは1行目に name,family,character 7# 2行目に カブ,アブラナ科,春の七草 8# 3行目以降 キキョウ,キキョウ科,秋の七草 9# といった感じで3列の値が並ぶ 10 11with open('plant.csv', newline='') as csvfile: 12 reader = csv.DictReader(csvfile) 13 rows = [] 14 for row in reader: 15 rows.append(row) 16 17# 上記DictReaderで読み込んだ辞書リストから、問題用に、ひとつの辞書を呼び出す 18p_plant = random.choice(rows) 19print(p_plant) 20p_name = p_plant["name"] 21 22# 問題用の植物と同じ科(family)の植物をリストにして、 23# その中から問題用の植物を削除。 24# 残りからひとつを選ぶ(=その植物が答えになる) 25 26q_list = [x['name'] for x in rows if x['family'] == p_plant["family"]] 27q_list.remove(p_plant["name"]) 28answer = random.choice(q_list) 29 30# 答えとは異なる科(family)の植物をリスト化し、そこから3つ選ぶ 31 32b_list = [x['name'] for x in rows if x['family'] != p_plant["family"]] 33b_options = random.sample(b_list , 3) 34b_options.append(str(answer)) 35 36tki = tkinter.Tk() 37tki.geometry('300x400') 38tki.title('ラジオボタン') 39 40# ラジオボタンのラベルをリスト化する 41rdo_txt = random.sample(b_options , k=4) 42# ラジオボタンの状態 43rdo_var = tkinter.IntVar() 44 45# ラジオボタンを動的に作成して配置 46for i in range(len(rdo_txt)): 47 rdo = tkinter.Radiobutton(tki, value=i, variable=rdo_var, text=rdo_txt[i]) 48 rdo.place(x=50, y=30 + (i * 24)) 49 50# ボタンクリックイベント 51def btn_click(): 52 num = rdo_var.get() 53 54 if rdo_txt[num] == str(answer): 55 tkinter.messagebox.showinfo('結果' , "正解!") 56 else: 57 tkinter.messagebox.showinfo("結果" , '不正解!正解は' + answer) 58 59# ボタン作成 60btn = tkinter.Button(tki, text='答え合わせ', command=btn_click) 61btn.place(x=100, y=170) 62 63var = tkinter.StringVar() 64var.set(p_name + "と同じ科の植物はどれでしょう") 65label = tkinter.Label(tki, textvariable=var, width=100, ) 66label.pack() 67 68tki.mainloop()
試したこと
<1>
p_plant = random.choice(rows)~
以降を関数にしてボタンクリックイベントの下につけようとしましたが
3行目以降(p_nameの定義)が動きませんでした。
<2>
ボタンクリック後のshowinfoの戻り値をきっかけに
冒頭のrandom.choice(rows)に戻るループを何回かチャレンジしましたが
全くうまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/01/22 12:00
2020/01/22 16:54
退会済みユーザー
2020/01/23 11:50