1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

おもちゃで遊ぶAdvent Calendar 2022

Day 4

TkinterでAI学習用のGUIクイズアプリ作ってみた!

Last updated at Posted at 2022-12-04

はじめに

こんなものを作っていきます!

Qualification_measures

ソースコードはこちら↓
https://github.com/Kentea-Watanabe/Qualification_measures

全体の構成

  • 問題の取得
  • 問題の表示
  • 解答の表示
  • 問題の削除

問題の取得

問題と選択肢をcsvファイルで定義します。
答えのindexを最後に指定してますが0からスタートになっていることに注意。

問題文,解答1,解答2,解答3,解答4,答え
第一次AIブームとは?,推論と探索,学習と検証,エッジとノード,裸者と死者,0
第二次AIブームとは?,制御システム,受信システム,エキスパートシステム,輸送システム,2

問題文たちをリストで取得します。

self.quiz_list = [] # クイズデータリスト

df = pd.read_csv(CSV_FILE)
# CSVの各行をリスト化
self.quiz_list = [list(quiz) for quiz in zip(df["問題文"],df["選択肢1"],df["選択肢2"],df["選択肢3"],df["選択肢4"],df["答え"])]

このような2次元リストで取得できます~

[['第一次AIブームとは?', '推論と探索', '学習と検証', 'エッジとノード', '裸者と死者', 0], ['第二次AIブームとは?', '制御システム', '受信システム', 'エキスパートシステム', '輸送システム', 2]]

問題の表示

リストの番号で指定して、問題文を表示します。

def get_quiz(self):   # 問題文の表示
        question = tk.Label(self.master, text=self.quiz_list[0][0], width=20, height=5)
        # question = tk.Message(text=quiz_list[0][0])
        # クリックイベントの指定
        select1 = tk.Button(self.master, text = self.quiz_list[0][1], 
                            command = self.button_click_anser, # クリック時に呼び出されるメソッド名
                            width = 20, height = 2
                            )
        select2 = tk.Button(self.master, text = self.quiz_list[0][2], 
                            command = self.button_click_anser, # クリック時に呼び出されるメソッド名
                            width = 20, height = 2
                            )
        select3 = tk.Button(self.master, text = self.quiz_list[0][3], 
                            command = self.button_click_anser, # クリック時に呼び出されるメソッド名
                            width = 20, height = 2
                            )
        select4 = tk.Button(self.master, text = self.quiz_list[0][4], 
                            command = self.button_click_anser, # クリック時に呼び出されるメソッド名
                            width = 20, height = 2
                            )
        # ボタンの配置
        question.grid(row=0, column=1)
        select1.grid(row=5, column=1)
        select2.grid(row=5, column=2)
        select3.grid(row=5, column=3)
        select4.grid(row=5, column=4)

tk.Buttonの引数にcommandを追加すると、ボタンが押されたときに関数を呼び出せます。
なので、

command = self.button_click_anser

のようにすると、ボタンを押した後にbutton_click_anser()の関数を呼び出せます。
こちらの関数で解答の表示を行います。

解答の表示

ここでは、解答の表示と次の問題へと遷移させるボタンを作成します。

def button_click_anser(self):
        # 答えの表示
        anser_index = self.quiz_list[0][5] + 1
        self.anser = tk.Label(self.master, text="答え : " + self.quiz_list[0][anser_index], width=20, height=5)
        self.next = tk.Button(self.master, text = "Next", command = self.quiz_remove,width = 20, height = 2)
        # ボタンの配置
        self.anser.grid(row=6, column=1)
        self.next.grid(row=7, column=4)

問題の削除

button_click_anser関数でNextボタンが押されたときの処理です。
ここでは、すでに扱った問題を削除します。

def quiz_remove(self):
        # 答えの表示
        self.quiz_list.pop(0)
        self.anser.destroy() # 次の問題に移るので、解答ボタンの削除
        self.next.destroy() # 次の問題に移るので、Nextボタンの削除
        if self.quiz_list:
            # まだクイズがある場合は次のクイズを表示する
            self.get_quiz()
        else:
            # もうクイズがない場合はアプリを終了する
            self.end_app()

pop(0)で問題リストから問題を削除
self.anser.destroy()で解答ボタンの削除
self.next.destroy()でNextボタンの削除
※self.anser.destroy(), self.next.destroy()をしないと問題表示画面に戻った際に、解答のボタンとNextボタンが残ってしまいます。

参考

https://imagingsolution.net/program/python/tkinter/tkinter_create_button/
https://daeudaeu.com/tkinter_quiz/

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?