import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import sqlite3
def Database():
global conn, cursor
conn = sqlite3.connect("medalhas_jogos_olimpicos.db")
cursor = conn.cursor()
cursor.execute(
"""CREATE TABLE IF NOT EXISTS REGISTRATION (
RID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
NOMEPAIS TEXT UNIQUE,
MEDALHAOURO INTEGER,
MEDALHAPRATA INTEGER,
MEDALHABRONZE INTEGER,
TOTAL INTEGER
)"""
)
conn.commit()
def DisplayForm():
global root, tree, SEARCH, nome_pais, medalha_ouro, medalha_prata, medalha_bronze
root = tk.Tk()
root.geometry("900x500")
root.title("Registar Jogos Olímpicos")
SEARCH = tk.StringVar()
nome_pais = tk.StringVar()
medalha_ouro = tk.StringVar()
medalha_prata = tk.StringVar()
medalha_bronze = tk.StringVar()
# Layout
TopViewForm = tk.Frame(root, width=600, bd=1, relief=tk.SOLID)
TopViewForm.pack(side=tk.TOP, fill=tk.X)
LFrom = tk.Frame(root, width="350", bg="#15244C")
LFrom.pack(side=tk.LEFT, fill=tk.Y)
LeftViewForm = tk.Frame(root, width=500, bg="#0B4670")
LeftViewForm.pack(side=tk.LEFT, fill=tk.Y)
MidViewForm = tk.Frame(root, width=600)
MidViewForm.pack(side=tk.RIGHT)
# Top section
lbl_text = tk.Label(TopViewForm, text="Registar Jogos Olímpicos", font=('verdana', 18), width=600, bg="cyan")
lbl_text.pack(fill=tk.X)
# Form inputs
tk.Label(LFrom, text="Nome do País", font=("Arial", 12), bg="#15244C", fg="white").pack(side=tk.TOP)
tk.Entry(LFrom, font=("Arial", 10, "bold"), textvariable=nome_pais).pack(side=tk.TOP, padx=10, fill=tk.X)
tk.Label(LFrom, text="Número de Medalhas de Ouro", font=("Arial", 12), bg="#15244C", fg="white").pack(side=tk.TOP)
tk.Entry(LFrom, font=("Arial", 10, "bold"), textvariable=medalha_ouro).pack(side=tk.TOP, padx=10, fill=tk.X)
tk.Label(LFrom, text="Número de Medalhas de Prata", font=("Arial", 12), bg="#15244C", fg="white").pack(side=tk.TOP)
tk.Entry(LFrom, font=("Arial", 10, "bold"), textvariable=medalha_prata).pack(side=tk.TOP, padx=10, fill=tk.X)
tk.Label(LFrom, text="Número de Medalhas de Bronze", font=("Arial", 12), bg="#15244C", fg="white").pack(side=tk.TOP)
tk.Entry(LFrom, font=("Arial", 10, "bold"), textvariable=medalha_bronze).pack(side=tk.TOP, padx=10, fill=tk.X)
tk.Button(LFrom, text="Submeter", font=("Arial", 10, "bold"), bg="#15244C", fg="white", command=register).pack(side=tk.TOP, padx=10, pady=5, fill=tk.X)
# Left section
lbl_txtsearch = tk.Label(LeftViewForm, text="Digite o Nome", font=('verdana', 10), bg="#0B4670")
lbl_txtsearch.pack()
search = tk.Entry(LeftViewForm, textvariable=SEARCH, font=('verdana', 15), width=10)
search.pack(side=tk.TOP, padx=10, fill=tk.X)
tk.Button(LeftViewForm, text="Pesquisar", command=SearchRecord, bg="cyan").pack(side=tk.TOP, padx=10, pady=10, fill=tk.X)
tk.Button(LeftViewForm, text="Ver tudo", bg="cyan", command=DisplayData).pack(side=tk.TOP, padx=10, pady=10, fill=tk.X)
tk.Button(LeftViewForm, text="Limpar", bg="cyan", command=limpar).pack(side=tk.TOP, padx=10, pady=10, fill=tk.X)
tk.Button(LeftViewForm, text="Apagar", bg="cyan", command=apagar).pack(side=tk.TOP, padx=10, pady=10, fill=tk.X)
tk.Button(LeftViewForm, text="Atualizar", bg="cyan", command=actualizacao).pack(side=tk.TOP, padx=10, pady=10, fill=tk.X)
# Treeview
scrollbarx = tk.Scrollbar(MidViewForm, orient=tk.HORIZONTAL)
scrollbary = tk.Scrollbar(MidViewForm, orient=tk.VERTICAL)
tree = ttk.Treeview(MidViewForm, columns=("Id", "NomePais", "MedalhaOuro", "MedalhaPrata", "MedalhaBronze", "Total"),
selectmode="extended", height=20, yscrollcommand=scrollbary.set, xscrollcommand=scrollbarx.set)
scrollbarx.config(command=tree.xview)
scrollbary.config(command=tree.yview)
scrollbarx.pack(side=tk.BOTTOM, fill=tk.X)
scrollbary.pack(side=tk.RIGHT, fill=tk.Y)
tree.pack(expand=True, fill=tk.BOTH)
tree.heading('Id', text="Id", anchor=tk.W)
tree.heading('NomePais', text="Nome do País", anchor=tk.W)
tree.heading('MedalhaOuro', text="Medalha Ouro", anchor=tk.W)
tree.heading('MedalhaPrata', text="Medalha Prata", anchor=tk.W)
tree.heading('MedalhaBronze', text="Medalha Bronze", anchor=tk.W)
tree.heading('Total', text="Total de Medalhas", anchor=tk.W)
tree.column('#0', stretch=tk.NO, minwidth=0, width=0)
tree.column('#1', stretch=tk.NO, minwidth=0, width=100)
tree.column('#2', stretch=tk.NO, minwidth=0, width=150)
tree.column('#3', stretch=tk.NO, minwidth=0, width=80)
tree.column('#4', stretch=tk.NO, minwidth=0, width=120)
tree.column('#5', stretch=tk.NO, minwidth=0, width=120)
tree.bind("<Double-1>", OnDoubleClick)
DisplayData()
root.mainloop()
def validate_medal_input(value):
"""Validate if the input is a non-negative integer."""
try:
return int(value)
except ValueError:
messagebox.showwarning("Atenção", "Digite um número válido para as medalhas.")
return None
def register():
Database()
vnome = nome_pais.get()
vmedalha_ouro = validate_medal_input(medalha_ouro.get())
vmedalha_prata = validate_medal_input(medalha_prata.get())
vmedalha_bronze = validate_medal_input(medalha_bronze.get())
if vnome == '' or vmedalha_ouro is None or vmedalha_prata is None or vmedalha_bronze is None:
messagebox.showinfo("Atenção", "Preencha todos os campos corretamente!")
else:
total = vmedalha_ouro + vmedalha_prata + vmedalha_bronze
try:
cursor.execute('INSERT INTO REGISTRATION (NOMEPAIS, MEDALHAOURO, MEDALHAPRATA, MEDALHABRONZE, TOTAL) VALUES (?, ?, ?, ?, ?)',
(vnome, vmedalha_ouro, vmedalha_prata, vmedalha_bronze, total))
conn.commit()
messagebox.showinfo("Sucesso", "Registro adicionado com sucesso")
DisplayData()
except sqlite3.IntegrityError:
messagebox.showwarning("Atenção", "O nome do país já existe. Use um nome diferente.")
conn.close()
def actualizacao():
Database()
vnome = nome_pais.get()
vmedalha_ouro = validate_medal_input(medalha_ouro.get())
vmedalha_prata = validate_medal_input(medalha_prata.get())
vmedalha_bronze = validate_medal_input(medalha_bronze.get())
if vnome == '' or vmedalha_ouro is None or vmedalha_prata is None or vmedalha_bronze is None:
messagebox.showinfo("Atenção", "Preencha todos os campos corretamente!")
else:
total = vmedalha_ouro + vmedalha_prata + vmedalha_bronze
curItem = tree.focus()
if curItem:
contents = tree.item(curItem)
selecteditem = contents['values']
cursor.execute('UPDATE REGISTRATION SET NOMEPAIS=?, MEDALHAOURO=?, MEDALHAPRATA=?, MEDALHABRONZE=?, TOTAL=? WHERE RID=?',
(vnome, vmedalha_ouro, vmedalha_prata, vmedalha_bronze, total, selecteditem[0]))
conn.commit()
messagebox.showinfo("Sucesso", "Atualização realizada com sucesso")
limpar()
DisplayData()
else:
messagebox.showwarning("Atenção", "Selecione um registro para atualizar.")
conn.close()
def limpar():
nome_pais.set("")
medalha_ouro.set("")
medalha_prata.set("")
medalha_bronze.set("")
SEARCH.set("")
def apagar():
Database()
curItem = tree.focus()
if curItem:
contents = tree.item(curItem)
selecteditem = contents['values']
cursor.execute('DELETE FROM REGISTRATION WHERE RID=?', (selecteditem[0],))
conn.commit()
messagebox.showinfo("Sucesso", "Registro removido com sucesso")
limpar()
DisplayData()
else:
messagebox.showwarning("Atenção", "Selecione um registro para apagar.")
conn.close()
def SearchRecord():
Database()
search_term = SEARCH.get()
if search_term == "":
DisplayData()
else:
cursor.execute('SELECT * FROM REGISTRATION WHERE NOMEPAIS LIKE ?', ('%' + search_term + '%',))
rows = cursor.fetchall()
update_tree(rows)
conn.close()
def DisplayData():
Database()
cursor.execute('SELECT * FROM REGISTRATION')
rows = cursor.fetchall()
update_tree(rows)
conn.close()
def update_tree(rows):
tree.delete(*tree.get_children())
for row in rows:
tree.insert('', 'end', values=row)
def OnDoubleClick(event):
curItem = tree.focus()
if curItem:
contents = tree.item(curItem)
selecteditem = contents['values']
if selecteditem:
nome_pais.set(selecteditem[1])
medalha_ouro.set(selecteditem[2])
medalha_prata.set(selecteditem[3])
medalha_bronze.set(selecteditem[4])
if __name__ == '__main__':
Database()
DisplayForm()