Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter as tk
- from tkinter import messagebox, ttk
- import sqlite3
- import threading
- import time
- import datetime
- from reportlab.lib.pagesizes import letter
- from reportlab.pdfgen import canvas
- # Banco de dados
- def setup_database():
- conn = sqlite3.connect("contador_cerveja.db")
- cursor = conn.cursor()
- cursor.execute("""
- CREATE TABLE IF NOT EXISTS contador (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- timestamp TEXT,
- acao TEXT,
- contagem INTEGER
- )
- """)
- conn.commit()
- conn.close()
- def salvar_acao(acao, contagem):
- conn = sqlite3.connect("contador_cerveja.db")
- cursor = conn.cursor()
- timestamp = datetime.datetime.now().strftime("%d/%m/%Y %H:%M:%S")
- cursor.execute("INSERT INTO contador (timestamp, acao, contagem) VALUES (?, ?, ?)", (timestamp, acao, contagem))
- conn.commit()
- conn.close()
- def carregar_ultima_contagem():
- conn = sqlite3.connect("contador_cerveja.db")
- cursor = conn.cursor()
- cursor.execute("SELECT contagem FROM contador ORDER BY id DESC LIMIT 1")
- resultado = cursor.fetchone()
- conn.close()
- return resultado[0] if resultado else 0
- def carregar_dados():
- conn = sqlite3.connect("contador_cerveja.db")
- cursor = conn.cursor()
- cursor.execute("SELECT * FROM contador ORDER BY id DESC")
- registros = cursor.fetchall()
- conn.close()
- return registros
- def apagar_dados():
- conn = sqlite3.connect("contador_cerveja.db")
- cursor = conn.cursor()
- cursor.execute("DELETE FROM contador")
- conn.commit()
- conn.close()
- messagebox.showinfo("Banco de Dados", "Todos os dados foram apagados com sucesso!")
- # Funções do programa
- def atualizar_relogio():
- while True:
- hora_atual = time.strftime("%H:%M:%S")
- lbl_relogio.config(text=hora_atual)
- time.sleep(1)
- def centralizar_janela(janela):
- janela.update_idletasks()
- largura = janela.winfo_width()
- altura = janela.winfo_height()
- largura_tela = janela.winfo_screenwidth()
- altura_tela = janela.winfo_screenheight()
- pos_x = (largura_tela // 2) - (largura // 2)
- pos_y = (altura_tela // 2) - (altura // 2)
- janela.geometry(f"{largura}x{altura}+{pos_x}+{pos_y}")
- def adicionar_lata():
- global contagem
- contagem += 1
- lbl_contagem.config(text=f"Contagem: {contagem}")
- salvar_acao("Adicionou", contagem)
- def remover_lata():
- global contagem
- if contagem > 0:
- contagem -= 1
- lbl_contagem.config(text=f"Contagem: {contagem}")
- salvar_acao("Removeu", contagem)
- else:
- messagebox.showwarning("Aviso", "A contagem já está em zero!")
- def zerar_contagem():
- global contagem
- contagem = 0
- lbl_contagem.config(text=f"Contagem: {contagem}")
- salvar_acao("Zerou", contagem)
- def mostrar_relatorio():
- dados = carregar_dados()
- if not dados:
- messagebox.showinfo("Relatório", "Nenhuma ação registrada até o momento.")
- return
- janela_relatorio = tk.Toplevel(janela)
- janela_relatorio.title("Relatório de Ações")
- janela_relatorio.geometry("500x300")
- centralizar_janela(janela_relatorio)
- tree = ttk.Treeview(janela_relatorio, columns=("ID", "Timestamp", "Ação", "Contagem"), show="headings")
- tree.heading("ID", text="ID")
- tree.heading("Timestamp", text="Horário")
- tree.heading("Ação", text="Ação")
- tree.heading("Contagem", text="Contagem")
- tree.column("ID", width=50)
- tree.column("Timestamp", width=150)
- tree.column("Ação", width=100)
- tree.column("Contagem", width=100)
- for registro in dados:
- tree.insert("", tk.END, values=registro)
- tree.pack(fill=tk.BOTH, expand=True)
- def gerar_pdf():
- dados = carregar_dados()
- if not dados:
- messagebox.showinfo("Relatório", "Nenhuma ação registrada para gerar o PDF.")
- return
- nome_arquivo = "relatorio_contador.pdf"
- c = canvas.Canvas(nome_arquivo, pagesize=letter)
- c.setFont("Helvetica", 12)
- c.drawString(50, 750, "Relatório de Ações - Contador de Latas de Cerveja")
- c.drawString(50, 735, f"Gerado em: {datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S')}")
- c.drawString(50, 720, "-" * 80)
- y = 700
- for registro in dados:
- texto = f"ID: {registro[0]} | Horário: {registro[1]} | Ação: {registro[2]} | Contagem: {registro[3]}"
- c.drawString(50, y, texto)
- y -= 15
- if y < 50:
- c.showPage()
- c.setFont("Helvetica", 12)
- y = 750
- c.save()
- messagebox.showinfo("PDF Gerado", f"O relatório foi salvo como '{nome_arquivo}'.")
- # Configuração inicial
- setup_database()
- contagem = carregar_ultima_contagem()
- # Interface gráfica
- janela = tk.Tk()
- janela.title("Contador de Latas de Cerveja")
- # Configurando os widgets
- lbl_relogio = tk.Label(janela, font=("Arial", 16), fg="blue")
- lbl_relogio.pack(pady=10)
- lbl_contagem = tk.Label(janela, text=f"Contagem: {contagem}", font=("Arial", 14))
- lbl_contagem.pack(pady=10)
- btn_adicionar = tk.Button(janela, text="Adicionar Lata", command=adicionar_lata)
- btn_adicionar.pack(pady=5)
- btn_remover = tk.Button(janela, text="Remover Lata", command=remover_lata)
- btn_remover.pack(pady=5)
- btn_zerar = tk.Button(janela, text="Zerar Contagem", command=zerar_contagem)
- btn_zerar.pack(pady=5)
- btn_relatorio = tk.Button(janela, text="Mostrar Relatório", command=mostrar_relatorio)
- btn_relatorio.pack(pady=5)
- btn_pdf = tk.Button(janela, text="Gerar PDF", command=gerar_pdf)
- btn_pdf.pack(pady=5)
- btn_apagar = tk.Button(janela, text="Apagar Banco de Dados", command=apagar_dados)
- btn_apagar.pack(pady=5)
- # Centralizando a janela
- janela.geometry("300x350")
- centralizar_janela(janela)
- # Thread para o relógio
- thread_relogio = threading.Thread(target=atualizar_relogio, daemon=True)
- thread_relogio.start()
- # Iniciando a aplicação
- janela.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement