from tkinter import *
import tkinter.ttk as ttk
import tkinter.messagebox as tkMessageBox
import sqlite3
from datetime import date
# Função para criar/abrir a base de dados e adicionar coluna CATEGORIA se não existir
def Database():
global conn, cursor
conn = sqlite3.connect("sugestos_data.db")
cursor = conn.cursor()
cursor.execute(
"CREATE TABLE IF NOT EXISTS REGISTRATION (RID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
" DATA TEXT, SUGESTAO TEXT)") # Criar tabela sem a coluna CATEGORIA se não existir
try:
cursor.execute("ALTER TABLE REGISTRATION ADD COLUMN CATEGORIA TEXT") # Adiciona coluna CATEGORIA se não existir
except sqlite3.OperationalError:
pass # A coluna já existe
conn.commit()
# Exibir o formulário principal
def DisplayForm():
global tree, SEARCH, data, sugestao, categoria
root = Tk()
root.geometry("800x400")
root.title("Sugestões")
# Variáveis
SEARCH = StringVar()
sugestao = StringVar()
categoria = StringVar()
data = StringVar(value=date.today().strftime("%Y-%m-%d"))
# Layout
TopViewForm = Frame(root, width=300, bd=1, relief=SOLID)
TopViewForm.pack(side=TOP, fill=X)
LFrom = Frame(root, width="350", bg="#15244C")
LFrom.pack(side=LEFT, fill=Y)
LeftViewForm = Frame(root, width=300, bg="#0B4670")
LeftViewForm.pack(side=LEFT, fill=Y)
MidViewForm = Frame(root, width=400)
MidViewForm.pack(side=RIGHT)
# Título
lbl_text = Label(TopViewForm,
text="Sugestões",
font=('verdana', 18), width=600, bg="cyan")
lbl_text.pack(fill=X)
# Campo de Data
Label(LFrom, text="Data ", font=("Arial", 12),
bg="#15244C", fg="white").pack(side=TOP)
Entry(LFrom, font=("Arial", 10, "bold"),
textvariable=data).pack(side=TOP, padx=10, fill=X)
# Campo de Sugestão
Label(LFrom, text="Sugestão ", font=("Arial", 12),
bg="#15244C", fg="white").pack(side=TOP)
Entry(LFrom, font=("Arial", 10, "bold"),
textvariable=sugestao).pack(side=TOP, padx=10, fill=X)
# Campo de Categoria
Label(LFrom, text="Categoria ", font=("Arial", 12),
bg="#15244C", fg="white").pack(side=TOP)
categories = ttk.Combobox(LFrom, textvariable=categoria, values=["Reclamação", "Sugestão de Melhoria", "Dúvida"], state="readonly")
categories.pack(side=TOP, padx=10, fill=X)
# Botão Submeter
Button(LFrom, text="Submeter", font=("Arial", 10, "bold"),
bg="cyan", command=register).pack(side=TOP, padx=10, pady=5, fill=X)
# Campo de Busca
lbl_txtsearch = Label(LeftViewForm, text="Categoria",
font=('verdana', 12,"bold"), bg="#0B4670",fg="White")
lbl_txtsearch.pack()
ttk.Combobox(LeftViewForm, textvariable=SEARCH, values=["Reclamação", "Sugestão de Melhoria", "Dúvida"],
state="readonly").pack(side=TOP, padx=10, fill=X)
# Botões
Button(LeftViewForm, text="Pesquisar", bg="cyan", command=SearchRecord
).pack(side=TOP, padx=10, pady=10, fill=X)
Button(LeftViewForm, text="Ver tudo", bg="cyan", command=DisplayData
).pack(side=TOP, padx=10, pady=10, fill=X)
Button(LeftViewForm, text="Limpar", bg="cyan", command=limpar
).pack(side=TOP, padx=10, pady=10, fill=X)
# Configuração da tabela
scrollbarx = Scrollbar(MidViewForm, orient=HORIZONTAL)
scrollbary = Scrollbar(MidViewForm, orient=VERTICAL)
tree = ttk.Treeview(MidViewForm, columns=("RID", "Data", "Sugestão", "Categoria"),
selectmode="extended", height=100,
yscrollcommand=scrollbary.set, xscrollcommand=scrollbarx.set)
scrollbary.config(command=tree.yview)
scrollbary.pack(side=RIGHT, fill=Y)
scrollbarx.config(command=tree.xview)
scrollbarx.pack(side=BOTTOM, fill=X)
# Configurar colunas
tree.heading('RID', text="ID", anchor=W)
tree.heading('Data', text="Data", anchor=W)
tree.heading('Sugestão', text="Sugestão", anchor=W)
tree.heading('Categoria', text="Categoria", anchor=W) # Nova coluna de categoria
tree.column('#0', stretch=NO, minwidth=0, width=0)
tree.column('#1', stretch=NO, minwidth=0, width=50)
tree.column('#2', stretch=NO, minwidth=0, width=100)
tree.column('#3', stretch=NO, minwidth=0, width=100) # Largura da coluna Categoria
tree.pack()
tree.bind("<Double-1>", OnDoubleClick)
DisplayData()
root.mainloop()
# Função para submeter uma sugestão
def register():
Database()
vdata = data.get()
vsugestao = sugestao.get()
vcategoria = categoria.get()
if vdata == '' or vsugestao == "" or vcategoria == "":
tkMessageBox.showinfo("Atenção", "Preencha todos os campos!")
else:
conn.execute('INSERT INTO REGISTRATION (DATA, SUGESTAO, CATEGORIA) VALUES (?, ?, ?)',
(vdata, vsugestao, vcategoria)) # Adiciona a categoria ao banco de dados
conn.commit()
tkMessageBox.showinfo("Sucesso", "Sugestão adicionada com sucesso")
DisplayData()
conn.close()
# Função para exibir os dados
def DisplayData():
Database()
tree.delete(*tree.get_children())
cursor = conn.execute("SELECT * FROM REGISTRATION")
for row in cursor.fetchall():
tree.insert('', 'end', values=row)
cursor.close()
conn.close()
# Função de clique duplo na tabela
def OnDoubleClick(event):
curItem = tree.focus()
contents = tree.item(curItem)
selecteditem = contents['values']
if selecteditem:
data.set(selecteditem[1])
sugestao.set(selecteditem[2])
categoria.set(selecteditem[3]) # Exibe a categoria ao clicar na sugestão
# Função para pesquisar por categoria
def SearchRecord():
Database()
search_category = SEARCH.get()
if search_category == "":
tkMessageBox.showinfo("Atenção", "Selecione uma categoria para pesquisar!")
else:
tree.delete(*tree.get_children())
cursor = conn.execute("SELECT * FROM REGISTRATION WHERE CATEGORIA = ?", (search_category,))
for row in cursor.fetchall():
tree.insert('', 'end', values=row)
cursor.close()
conn.close()
# Função para limpar os campos
def limpar():
sugestao.set("")
data.set(date.today().strftime("%Y-%m-%d"))
categoria.set("")
# Função principal
if __name__ == '__main__':
DisplayForm()