Tento program pro Windows vytváří jednoduchou uživatelskou aplikaci pro matematický trénink.
Uživatel si může vybrat, kolik úloh chce vyřešit, a jak velký bude maximální možný výsledek každé úlohy.
Dále si může vybrat druh aritmetické operace, kterou chce trénovat, tj. sčítání, odečítání, násobení nebo dělení.
Po stisku tlačítka “TESTOVAT” program vygeneruje požadované množství úloh s náhodně vybranými čísly vzhledem k vybraným parametrům.
Uživatel poté tyto úlohy postupně řeší a potvrdí tlačítkem ‘Odpovědět’. Po potvrzení odpovědi se zobrazí další úloha.
Po vyřešení všech úloh se zobrazí skóre uživatele, které ukazuje, kolik úloh řešil správně.
Poté má uživatel možnost, pokud mu aplikace pomohla, přispět autorovi programu prostřednictvím tlačítka “Přispějte zde”, které otevře webovou stránku pro příspěvky.
Náhled programu:
Program je napsaný v Pythonu, chcete-li tento program dále vyvíjet nebo upravovat, níže poskytuji celý kód.
import tkinter as tk
import random
import webbrowser
root = tk.Tk()
root.title("Matematický tréning & PetrPikora.com")
root.geometry('450x380')
operation_dict = {
"+": "Sčítání",
"-": "Odečítání",
"x": "Násobení",
":": "Dělení"
}
global_vars = {
"current_task": 0,
"tasks": [],
"results": [],
"operation_key": "+"
}
def generate_task(num_task, max_res, operation):
tasks = []
for i in range(num_task):
if operation == "+":
a = random.randint(1, max_res - 1)
b = random.randint(1, max_res - a)
tasks.append((a, b, a + b))
elif operation == "-":
a = random.randint(2, max_res)
b = random.randint(1, a - 1)
tasks.append((a, b, a - b))
elif operation == "x":
a = random.randint(1, max_res)
b = random.randint(1, max_res // a)
tasks.append((a, b, a * b))
elif operation == ":":
b = random.randint(1, max_res)
a = b * random.randint(1, max_res // b)
tasks.append((a, b, a / b))
return tasks
def check_task():
ans = float(entry.get())
entry.delete(0, 'end')
global_vars['results'].append(round(ans, 2) == round(global_vars['tasks'][global_vars['current_task']][2], 2))
global_vars['current_task'] += 1
if global_vars['current_task'] < len(global_vars['tasks']):
task_label.config(text=f"{global_vars['tasks'][global_vars['current_task']][0]} {global_vars['operation_key']} {global_vars['tasks'][global_vars['current_task']][1]} = ?")
else:
result_label.config(text=f"Vaše skóre je: {global_vars['results'].count(True)}/{len(global_vars['tasks'])}")
task_label.config(text="")
entry.config(state='disabled')
check_button.config(state='disabled')
def start_test():
num_task = int(num_entry.get())
max_res = int(range_entry.get())
operation = operation_var.get()
operation_key = [k for k, v in operation_dict.items() if v == operation][0]
global_vars['operation_key'] = operation_key
global_vars['tasks'] = generate_task(num_task, max_res, operation_key)
global_vars['current_task'] = 0
global_vars['results'] = []
task_label.config(text=f"{global_vars['tasks'][global_vars['current_task']][0]} {operation_key} {global_vars['tasks'][global_vars['current_task']][1]} = ?")
result_label.config(text="")
entry.bind("", lambda event: check_task())
check_button.config(state='normal')
entry.config(state='normal')
num_label = tk.Label(root, text="Počet úloh:", font=('Helvetica', 14))
num_label.pack()
num_entry = tk.Entry(root, font=('Helvetica', 14))
num_entry.pack()
range_label = tk.Label(root, text="Maximální výsledek:", font=('Helvetica', 14))
range_label.pack()
range_entry = tk.Entry(root, font=('Helvetica', 14))
range_entry.pack()
operation_var = tk.StringVar(root)
operation_var.set("Sčítání")
operation_menu = tk.OptionMenu(root, operation_var, *operation_dict.values())
operation_menu.config(font=('Helvetica', 14))
operation_menu.pack()
start_button = tk.Button(root, text="TESTOVAT", command=start_test, font=('Helvetica', 14))
start_button.pack()
task_label = tk.Label(root, text="", font=('Helvetica', 14))
task_label.pack()
entry = tk.Entry(root, state='disabled', font=('Helvetica', 14))
entry.pack()
result_label = tk.Label(root, text="", font=('Helvetica', 14))
result_label.pack()
check_button = tk.Button(root, text='Odpovědět', command=check_task, state='disabled', font=('Helvetica', 14))
check_button.pack()
def open_web():
webbrowser.open('https://www.paypal.com/paypalme/petrpikora')
help_label = tk.Label(root, text="Pomohl vám tento program?", font=('Helvetica', 8))
help_label.pack()
help_button = tk.Button(root, text="Přispějte zde", command=open_web, font=('Helvetica', 8))
help_button.pack()
root.mainloop()
A zde ještě jedna varianta doplněná o vykreslení posledních 10 výsledků v grafu:
import tkinter as tk
import random
import webbrowser
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
root = tk.Tk()
root.title("Matematický tréning & PetrPikora.com")
root.geometry('600x600')
operation_dict = {
"+": "Sčítání",
"-": "Odečítání",
"x": "Násobení",
":": "Dělení"
}
global_vars = {
"current_task": 0,
"tasks": [],
"results": [],
"operation_key": "+",
"prev_results": []
}
figure = plt.Figure(figsize=(6, 2), dpi=100)
ax = figure.add_subplot(111)
chart_type = FigureCanvasTkAgg(figure, root)
chart_type.get_tk_widget().pack(side=tk.BOTTOM)
def update_graph():
ax.clear()
x_data = range(len(global_vars["prev_results"]))
y_data = global_vars["prev_results"]
ax.bar(x_data, y_data)
chart_type.draw()
def generate_task(num_task, max_res, operation):
tasks = []
for i in range(num_task):
if operation == "+":
a = random.randint(1, max_res - 1)
b = random.randint(1, max_res - a)
tasks.append((a, b, a + b))
elif operation == "-":
a = random.randint(2, max_res)
b = random.randint(1, a - 1)
tasks.append((a, b, a - b))
elif operation == "x":
a = random.randint(1, max_res)
b = random.randint(1, max_res // a)
tasks.append((a, b, a * b))
elif operation == ":":
b = random.randint(1, max_res)
a = b * random.randint(1, max_res // b)
tasks.append((a, b, a / b))
return tasks
def check_task():
ans = float(entry.get())
entry.delete(0, 'end')
global_vars['results'].append(round(ans, 2) == round(global_vars['tasks'][global_vars['current_task']][2], 2))
global_vars['current_task'] += 1
if global_vars['current_task'] < len(global_vars['tasks']):
task_label.config(text=f"{global_vars['tasks'][global_vars['current_task']][0]} {global_vars['operation_key']} {global_vars['tasks'][global_vars['current_task']][1]} = ?")
else:
correct_answers = global_vars['results'].count(True)
success_rate = (correct_answers / len(global_vars['results'])) * 100 # compute success rate in percentage
global_vars["prev_results"].append(success_rate) # save the success rate instead of the raw score
if len(global_vars["prev_results"]) > 10:
global_vars["prev_results"].pop(0)
result_label.config(text=f"Vaše úspěšnost je: {success_rate}%")
task_label.config(text="")
entry.config(state='disabled')
check_button.config(state='disabled')
update_graph()
def start_test():
num_task = int(num_entry.get())
max_res = int(range_entry.get())
operation = operation_var.get()
operation_key = [k for k, v in operation_dict.items() if v == operation][0]
global_vars['operation_key'] = operation_key
global_vars['tasks'] = generate_task(num_task, max_res, operation_key)
global_vars['current_task'] = 0
global_vars['results'] = []
task_label.config(text=f"{global_vars['tasks'][global_vars['current_task']][0]} {operation_key} {global_vars['tasks'][global_vars['current_task']][1]} = ?")
result_label.config(text="")
entry.bind("", lambda event: check_task())
check_button.config(state='normal')
entry.config(state='normal')
num_label = tk.Label(root, text="Počet úloh:", font=('Helvetica', 14))
num_label.pack()
num_entry = tk.Entry(root, font=('Helvetica', 14))
num_entry.pack()
range_label = tk.Label(root, text="Maximální výsledek:", font=('Helvetica', 14))
range_label.pack()
range_entry = tk.Entry(root, font=('Helvetica', 14))
range_entry.pack()
operation_var = tk.StringVar(root)
operation_var.set("Sčítání")
operation_menu = tk.OptionMenu(root, operation_var, *operation_dict.values())
operation_menu.config(font=('Helvetica', 14))
operation_menu.pack()
start_button = tk.Button(root, text="Začít Test", command=start_test, font=('Helvetica', 14))
start_button.pack()
task_label = tk.Label(root, text="", font=('Helvetica', 14))
task_label.pack()
entry = tk.Entry(root, state='disabled', font=('Helvetica', 14))
entry.pack()
result_label = tk.Label(root, text="", font=('Helvetica', 14))
result_label.pack()
check_button = tk.Button(root, text='Odpovědět', command=check_task, state='disabled', font=('Helvetica', 14))
check_button.pack()
def open_web():
webbrowser.open('https://www.paypal.com/paypalme/petrpikora')
help_label = tk.Label(root, text="Pomohl vám tento program?", font=('Helvetica', 8))
help_label.pack()
help_button = tk.Button(root, text="Přispějte zde", command=open_web, font=('Helvetica', 8))
help_button.pack()
root.mainloop()