Tkinter app: Math test

import tkinter as tk
from tkinter import ttk
import random

class MathTest:
    def __init__(self, master):
        self.master = master
        self.master.title("Test di Matematica")
        self.master.geometry("400x300")
        
        self.current_question_index = 0
        self.score = 0
        self.level = 1
        self.questions = []

        self.setup_ui()
        self.start_test()

    def setup_ui(self):
        self.level_label = ttk.Label(self.master, text="Somme - Livello 1", font=("Arial", 16))
        self.level_label.pack(pady=10)

        self.progress_var = tk.DoubleVar()
        self.progress_bar = ttk.Progressbar(self.master, variable=self.progress_var, maximum=10, length=300)
        self.progress_bar.pack(pady=10)

        self.question_label = ttk.Label(self.master, text="", font=("Arial", 14))
        self.question_label.pack(pady=10)

        self.answer_frame = ttk.Frame(self.master)
        self.answer_frame.pack(pady=10)

        self.result_label = ttk.Label(self.master, text="", font=("Arial", 12))
        self.result_label.pack(pady=10)

        self.next_button = ttk.Button(self.master, text="Prossima Domanda", command=self.next_question)
        self.next_button.pack(pady=10)
        self.next_button.config(state="disabled")

        self.restart_button = ttk.Button(self.master, text="Ripeti Test", command=self.start_test)
        self.restart_button.pack(pady=10)
        self.restart_button.config(state="disabled")

    def generate_question(self):
        max_num = self.level * 10
        num1 = random.randint(1, max_num)
        num2 = random.randint(1, max_num)
        answer = num1 + num2
        options = [answer]
        while len(options) < 4:
            option = random.randint(1, max_num * 2)
            if option not in options:
                options.append(option)
        random.shuffle(options)
        return {
            "question": f"{num1} + {num2} = ?",
            "options": options,
            "answer": answer
        }

    def start_test(self):
        self.current_question_index = 0
        self.score = 0
        self.questions = [self.generate_question() for _ in range(10)]
        self.level_label.config(text=f"Somme - Livello {self.level}")
        self.load_question()

    def load_question(self):
        if self.current_question_index < len(self.questions):
            question = self.questions[self.current_question_index]
            self.question_label.config(text=question["question"])
            
            for widget in self.answer_frame.winfo_children():
                widget.destroy()

            for option in question["options"]:
                button = ttk.Button(self.answer_frame, text=str(option), 
                                    command=lambda o=option: self.check_answer(o))
                button.pack(side="left", padx=5)

            self.next_button.config(state="disabled")
            self.result_label.config(text="")
            self.update_progress_bar()
        else:
            self.show_final_result()

    def check_answer(self, selected_answer):
        correct_answer = self.questions[self.current_question_index]["answer"]
        if selected_answer == correct_answer:
            self.score += 1
            self.result_label.config(text="Corretto!", foreground="green")
        else:
            self.result_label.config(text=f"Sbagliato! La risposta corretta è {correct_answer}.", foreground="red")
        
        for widget in self.answer_frame.winfo_children():
            widget.config(state="disabled")
        
        self.current_question_index += 1
        self.next_button.config(state="normal")

    def next_question(self):
        self.load_question()

    def show_final_result(self):
        result_message = f"Hai risposto correttamente a {self.score} domande su 10."
        if self.score > 7:
            self.level += 1
            result_message += " Ottimo lavoro! Il prossimo test sarà più difficile."
        else:
            self.level = 1
        
        self.question_label.config(text="")
        for widget in self.answer_frame.winfo_children():
            widget.destroy()
        self.result_label.config(text=result_message, foreground="black")
        self.next_button.config(state="disabled")
        self.restart_button.config(state="normal")

    def update_progress_bar(self):
        progress = (self.current_question_index / len(self.questions)) * 100
        self.progress_var.set(progress)

if __name__ == "__main__":
    root = tk.Tk()
    app = MathTest(root)
    root.mainloop()

New version


Subscribe to the newsletter for updates
Tkinter templates

Avatar My youtube channel

Twitter: @pythonprogrammi - python_pygame

Claude's Games

Arkanoid
Platform 2d

1. Memory game

Videos

Speech recognition game

Pygame's Platform Game

Other Pygame's posts

Advertisement