質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

781閲覧

pythonにおけるimport先のCSVファイルを正常に読み込みたい

Ataro

総合スコア0

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2022/01/28 10:47

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ソースを修正してみました。

python

1import tkinter 2from tkinter import messagebox 3import random 4import csv 5 6 7class Quiz: 8 CSV_FILE = "quiz.csv" # クイズの情報を格納したファイル 9 10 def __init__(self, master): 11 '''コンストラクタ 12 master:クイズ画面を配置するウィジェット 13 ''' 14 self.master = master 15 self.load() 16 self.createWidgets() 17 self.correct = 0 # 正解数 18 19 def load(self): 20 '''クイズの情報を取得する''' 21 with open(self.CSV_FILE, encoding="utf-8") as f: 22 self.quiz_list = list(csv.reader(f)) 23 random.shuffle(self.quiz_list) 24 self.index = 0 25 26 def createWidgets(self): 27 '''ウィジェットを作成・配置する''' 28 # 問題を表示するラベルを作成 29 self.problem = tkinter.Label(self.master, text="") 30 self.problem.grid(column=0, row=0, columnspan=4, pady=10) 31 32 # 問題選択ラジオボタンを作成 33 self.choices = [] 34 self.choice = tkinter.IntVar() 35 for i in range(4): 36 choice = tkinter.Radiobutton( 37 self.master, 38 text="", 39 variable=self.choice, 40 value=i 41 ) 42 choice.grid(row=1, column=i, padx=10, pady=10) 43 self.choices.append(choice) 44 45 # 答合せボタンを作成 46 self.button = tkinter.Button( 47 self.master, 48 text="答合せ", 49 command=self.checkAnswer 50 ) 51 self.button.grid(row=2, column=0, columnspan=4) 52 53 def show(self): 54 '''問題と選択肢を表示''' 55 if self.index >= len(self.quiz_list): 56 return False 57 problem, *selections, answer = self.quiz_list[self.index] 58 self.index += 1 59 self.problem["text"] = problem 60 for choice, selection in zip(self.choices, selections): 61 choice["text"] = selection 62 self.answer = int(answer) 63 return True 64 65 def checkAnswer(self): 66 '''解答が正解かどうかを表示し、次のクイズを表示する''' 67 if self.choice.get() == self.answer: 68 messagebox.showinfo("結果", "正解です!!") 69 self.correct += 1 70 else: 71 messagebox.showerror("結果", "不正解です...。" + 72 f"正解は{self.answer}です。" + 73 f"(あなたが選択したのは{self.choice.get()}です)") 74 if not self.show(): 75 self.end() 76 77 def end(self): 78 '''アプリを終了する''' 79 self.problem["text"] = f"終わりました。{len(self.quiz_list)}問中{self.correct}問正解です。" 80 for choice in self.choices: 81 choice.destroy() 82 self.button["text"] = "終了" 83 self.button["command"] = self.master.destroy 84 85 86def start(): 87 btn.destroy() 88 quiz = Quiz(app) 89 quiz.show() 90 91 92app = tkinter.Tk() 93app.geometry("300x200") 94app.title("クイズ") 95 96btn = tkinter.Button(app, text="クイズスタート", command=start) 97btn.place(x=140, y=170) 98 99app.mainloop()

投稿2022/01/28 12:55

shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問