pythonで様々なカテゴリの4択クイズを出すアプリケーションを作りたいと考えています。他のサイト(URL:https://daeudaeu.com/tkinter_quiz/) を参照してクイズの根幹部分は完成しました。これ単体ではうまく作動します。しかし、この根幹部分をボタンをクリックしたときに作動させようとしたとき、エラーが発生します。それは、回答者が4択のうちの何を選択しても一番左を選んだことになってしまい、一番左が正答である場合を除き、クリアできません。どうすればよいのでしょうか? なお、クイズの内容とその答えはCSVファイルで読み込んでいます。pythonのバージョンは310です。
python
1import tkinter 2from tkinter import messagebox 3import random 4import csv 5 6# クイズの情報を格納したファイル 7CSV_FILE = "quiz.csv" 8 9count = 0 10 11tki = tkinter.Tk() 12tki.geometry("300x200") 13tki.title("クイズ") 14 15 16 17def btn_click1(): 18 class Quiz(): 19 def __init__(self, master): 20 '''コンストラクタ 21 master:クイズ画面を配置するウィジェット 22 ''' 23 24 # 親ウィジェット 25 self.master = master 26 27 # クイズデータリスト 28 self.quiz_list = [] 29 30 # 現在表示中のクイズ 31 self.now_quiz = None 32 33 # 現在選択中の選択肢番号 34 self.choice_value = tkinter.IntVar() 35 36 self.getQuiz() 37 self.createWidgets() 38 self.showQuiz() 39 40 def getQuiz(self): 41 '''クイズの情報を取得する''' 42 43 # ファイルを開く 44 try: 45 f = open(CSV_FILE,encoding="utf-8") 46 except FileNotFoundError: 47 return None 48 49 # CSVデータとしてファイル読み込み 50 csv_data = csv.reader(f) 51 52 # CSVの各行をリスト化 53 for quiz in csv_data: 54 self.quiz_list.append(quiz) 55 56 f.close() 57 58 def createWidgets(self): 59 '''ウィジェットを作成・配置する''' 60 61 # フレームを作成する 62 self.frame = tkinter.Frame( 63 self.master, 64 width=400, 65 height=200, 66 ) 67 self.frame.pack() 68 69 # ボタンを作成する 70 self.button = tkinter.Button( 71 self.master, 72 text="OK", 73 command=self.checkAnswer 74 ) 75 self.button.pack() 76 77 def showQuiz(self): 78 '''問題と選択肢を表示''' 79 80 # まだ表示していないクイズからクイズ情報をランダムに取得 81 num_quiz = random.randrange(len(self.quiz_list)) 82 quiz = self.quiz_list[num_quiz] 83 84 # 問題を表示するラベルを作成 85 self.problem = tkinter.Label( 86 self.frame, 87 text=quiz[0] 88 ) 89 self.problem.grid( 90 column=0, 91 row=0, 92 columnspan=4, 93 pady=10 94 ) 95 96 # 選択肢を表示するラジオボタンを4つ作成 97 self.choices = [] 98 for i in range(4): 99 # ラジオボタンウィジェットを作成・配置 100 choice = tkinter.Radiobutton( 101 self.frame, 102 text=quiz[i+1], 103 variable=self.choice_value, 104 value=i 105 ) 106 choice.grid( 107 row=1, 108 column=i, 109 padx=10, 110 pady=10, 111 ) 112 # ウィジェットを覚えておく 113 self.choices.append(choice) 114 115 # 表示したクイズは再度表示しないようにリストから削除 116 self.quiz_list.remove(quiz) 117 118 # 現在表示中のクイズを覚えておく 119 self.now_quiz = quiz 120 121 def deleteQuiz(self): 122 '''問題と選択肢を削除''' 123 124 # 問題を表示するラベルを削除 125 self.problem.destroy() 126 127 # 選択肢を表示するラジオボタンを削除 128 for choice in self.choices: 129 choice.destroy() 130 131 def checkAnswer(self): 132 '''解答が正解かどうかを表示し、次のクイズを表示する''' 133 134 # 正解かどうかを確認してメッセージを表示 135 if self.choice_value.get() == int(self.now_quiz[5]): 136 messagebox.showinfo("結果", "正解です!!") 137 global count 138 count = count + 1 139 else: 140 messagebox.showerror("結果", "不正解です...。正解は"+str(self.now_quiz[5])+"です。(あなたが選択したのは"+str(self.choice_value.get())+"です)") 141 142 # 表示中のクイズを非表示にする 143 self.deleteQuiz() 144 145 if self.quiz_list: 146 # まだクイズがある場合は次のクイズを表示する 147 self.showQuiz() 148 else: 149 # もうクイズがない場合はアプリを終了する 150 self.endAppli() 151 152 def endAppli(self): 153 '''アプリを終了する''' 154 155 # クイズがもうないことを表示 156 self.problem = tkinter.Label( 157 self.frame, 158 text="終わりました。正解数は4問中"+str(count)+"問です" 159 ) 160 self.problem.grid( 161 column=0, 162 row=0, 163 padx=10, 164 pady=10 165 ) 166 167 # OKボタンのcommandを変更 168 self.button.config( 169 command=self.master.destroy 170 ) 171 app = tkinter.Tk() 172 quiz = Quiz(app) 173 app.mainloop() 174 175 176btn = tkinter.Button(tki,text="クイズスタート",command = btn_click1) 177btn.place(x = 140,y = 170) 178
なお、CSVファイルは次のようになっています。
quiz.csv
1「一」の意味は?,1,2,3,4,0 2「二」の意味は?,1,2,3,4,1 3「三」の意味は?,1,2,3,4,2 4「四」の意味は?,1,2,3,4,3
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。