general notes

いろいろなまとめ

tkinterで4択クイズアプリを開発

下記サイトの写経です。

daeudaeu.com

import csv
import random
import tkinter
from tkinter import messagebox

# https://daeudaeu.com/tkinter_quiz/

CSV_FILE = "quiz.csv"
class Quiz():

    def __init__(self, master):
        # master : クイズ画面を配置するウィジェット
        self.master = master
        self.quiz_list = []
        self.now_quiz = None
        self.choice_value = tkinter.IntVar()

        self.getQuiz()
        self.createWidgets()
        self.showQuiz()


    def getQuiz(self):
        with open(CSV_FILE, encoding="utf-8") as f:
            csv_data = csv.reader(f)
            for quiz in csv_data:
                self.quiz_list.append(quiz)


    def createWidgets(self):
        self.frame = tkinter.Frame(
            self.master,
            width=400,
            height=200,
        )
        self.frame.pack()

        self.button = tkinter.Button(
            self.master,
            text="OK",
            command=self.checkAnswer
        )
        self.button.pack(pady=5)

    def showQuiz(self):

        num_quiz = random.randrange(len(self.quiz_list))
        quiz = self.quiz_list[num_quiz]

        self.problem = tkinter.Label(
            self.frame,
            text=quiz[0]
        )

        self.problem.grid(
            column=0,
            row=0,
            columnspan=4,
            pady=10
        )

        self.choices = []
        for i in range(4):
            choice = tkinter.Radiobutton(
                self.frame,
                text=quiz[i+1],
                variable=self.choice_value,
                value=i
            )
            choice.grid(
                row=1,
                column=i,
                padx=10,
                pady=10
            )
            self.choices.append(choice)

        self.quiz_list.remove(quiz)
        self.now_quiz = quiz


    def checkAnswer(self):
        if self.choice_value.get() == int(self.now_quiz[5]):
            messagebox.showinfo("結果", "正解です!!")
        else:
            messagebox.showinfo("結果", "不正解です…")

        self.deleteQuiz()

        if self.quiz_list:
            self.showQuiz()
        else:
            self.endAppli()

    def deleteQuiz(self):
        self.problem.destroy()

        for choice in self.choices:
            choice.destroy()

    def endAppli(self):
        self.problem = tkinter.Label(
            self.frame,
            text="クイズは全て出題済みです"
        )

        self.problem.grid(
            column=0,
            row=0,
            padx=10,
            pady=10
        )

        self.button.config(
            command=self.master.destroy
        )



app = tkinter.Tk()
quiz = Quiz(app)
app.mainloop()