Advertisement
MizunoBrasil

Cadastro de Latas de Cerveja + Reportlab

Dec 10th, 2024
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.94 KB | None | 0 0
  1. import tkinter as tk
  2. from tkinter import messagebox, ttk
  3. import sqlite3
  4. import threading
  5. import time
  6. import datetime
  7. from reportlab.lib.pagesizes import letter
  8. from reportlab.pdfgen import canvas
  9.  
  10. # Banco de dados
  11. def setup_database():
  12.     conn = sqlite3.connect("contador_cerveja.db")
  13.     cursor = conn.cursor()
  14.     cursor.execute("""
  15.        CREATE TABLE IF NOT EXISTS contador (
  16.            id INTEGER PRIMARY KEY AUTOINCREMENT,
  17.            timestamp TEXT,
  18.            acao TEXT,
  19.            contagem INTEGER
  20.        )
  21.    """)
  22.     conn.commit()
  23.     conn.close()
  24.  
  25. def salvar_acao(acao, contagem):
  26.     conn = sqlite3.connect("contador_cerveja.db")
  27.     cursor = conn.cursor()
  28.     timestamp = datetime.datetime.now().strftime("%d/%m/%Y %H:%M:%S")
  29.     cursor.execute("INSERT INTO contador (timestamp, acao, contagem) VALUES (?, ?, ?)", (timestamp, acao, contagem))
  30.     conn.commit()
  31.     conn.close()
  32.  
  33. def carregar_ultima_contagem():
  34.     conn = sqlite3.connect("contador_cerveja.db")
  35.     cursor = conn.cursor()
  36.     cursor.execute("SELECT contagem FROM contador ORDER BY id DESC LIMIT 1")
  37.     resultado = cursor.fetchone()
  38.     conn.close()
  39.     return resultado[0] if resultado else 0
  40.  
  41. def carregar_dados():
  42.     conn = sqlite3.connect("contador_cerveja.db")
  43.     cursor = conn.cursor()
  44.     cursor.execute("SELECT * FROM contador ORDER BY id DESC")
  45.     registros = cursor.fetchall()
  46.     conn.close()
  47.     return registros
  48.  
  49. def apagar_dados():
  50.     conn = sqlite3.connect("contador_cerveja.db")
  51.     cursor = conn.cursor()
  52.     cursor.execute("DELETE FROM contador")
  53.     conn.commit()
  54.     conn.close()
  55.     messagebox.showinfo("Banco de Dados", "Todos os dados foram apagados com sucesso!")
  56.  
  57. # Funções do programa
  58. def atualizar_relogio():
  59.     while True:
  60.         hora_atual = time.strftime("%H:%M:%S")
  61.         lbl_relogio.config(text=hora_atual)
  62.         time.sleep(1)
  63.  
  64. def centralizar_janela(janela):
  65.     janela.update_idletasks()
  66.     largura = janela.winfo_width()
  67.     altura = janela.winfo_height()
  68.     largura_tela = janela.winfo_screenwidth()
  69.     altura_tela = janela.winfo_screenheight()
  70.     pos_x = (largura_tela // 2) - (largura // 2)
  71.     pos_y = (altura_tela // 2) - (altura // 2)
  72.     janela.geometry(f"{largura}x{altura}+{pos_x}+{pos_y}")
  73.  
  74. def adicionar_lata():
  75.     global contagem
  76.     contagem += 1
  77.     lbl_contagem.config(text=f"Contagem: {contagem}")
  78.     salvar_acao("Adicionou", contagem)
  79.  
  80. def remover_lata():
  81.     global contagem
  82.     if contagem > 0:
  83.         contagem -= 1
  84.         lbl_contagem.config(text=f"Contagem: {contagem}")
  85.         salvar_acao("Removeu", contagem)
  86.     else:
  87.         messagebox.showwarning("Aviso", "A contagem já está em zero!")
  88.  
  89. def zerar_contagem():
  90.     global contagem
  91.     contagem = 0
  92.     lbl_contagem.config(text=f"Contagem: {contagem}")
  93.     salvar_acao("Zerou", contagem)
  94.  
  95. def mostrar_relatorio():
  96.     dados = carregar_dados()
  97.     if not dados:
  98.         messagebox.showinfo("Relatório", "Nenhuma ação registrada até o momento.")
  99.         return
  100.    
  101.     janela_relatorio = tk.Toplevel(janela)
  102.     janela_relatorio.title("Relatório de Ações")
  103.     janela_relatorio.geometry("500x300")
  104.     centralizar_janela(janela_relatorio)
  105.  
  106.     tree = ttk.Treeview(janela_relatorio, columns=("ID", "Timestamp", "Ação", "Contagem"), show="headings")
  107.     tree.heading("ID", text="ID")
  108.     tree.heading("Timestamp", text="Horário")
  109.     tree.heading("Ação", text="Ação")
  110.     tree.heading("Contagem", text="Contagem")
  111.     tree.column("ID", width=50)
  112.     tree.column("Timestamp", width=150)
  113.     tree.column("Ação", width=100)
  114.     tree.column("Contagem", width=100)
  115.  
  116.     for registro in dados:
  117.         tree.insert("", tk.END, values=registro)
  118.  
  119.     tree.pack(fill=tk.BOTH, expand=True)
  120.  
  121. def gerar_pdf():
  122.     dados = carregar_dados()
  123.     if not dados:
  124.         messagebox.showinfo("Relatório", "Nenhuma ação registrada para gerar o PDF.")
  125.         return
  126.  
  127.     nome_arquivo = "relatorio_contador.pdf"
  128.     c = canvas.Canvas(nome_arquivo, pagesize=letter)
  129.     c.setFont("Helvetica", 12)
  130.  
  131.     c.drawString(50, 750, "Relatório de Ações - Contador de Latas de Cerveja")
  132.     c.drawString(50, 735, f"Gerado em: {datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S')}")
  133.     c.drawString(50, 720, "-" * 80)
  134.  
  135.     y = 700
  136.     for registro in dados:
  137.         texto = f"ID: {registro[0]} | Horário: {registro[1]} | Ação: {registro[2]} | Contagem: {registro[3]}"
  138.         c.drawString(50, y, texto)
  139.         y -= 15
  140.         if y < 50:
  141.             c.showPage()
  142.             c.setFont("Helvetica", 12)
  143.             y = 750
  144.  
  145.     c.save()
  146.     messagebox.showinfo("PDF Gerado", f"O relatório foi salvo como '{nome_arquivo}'.")
  147.  
  148. # Configuração inicial
  149. setup_database()
  150. contagem = carregar_ultima_contagem()
  151.  
  152. # Interface gráfica
  153. janela = tk.Tk()
  154. janela.title("Contador de Latas de Cerveja")
  155.  
  156. # Configurando os widgets
  157. lbl_relogio = tk.Label(janela, font=("Arial", 16), fg="blue")
  158. lbl_relogio.pack(pady=10)
  159.  
  160. lbl_contagem = tk.Label(janela, text=f"Contagem: {contagem}", font=("Arial", 14))
  161. lbl_contagem.pack(pady=10)
  162.  
  163. btn_adicionar = tk.Button(janela, text="Adicionar Lata", command=adicionar_lata)
  164. btn_adicionar.pack(pady=5)
  165.  
  166. btn_remover = tk.Button(janela, text="Remover Lata", command=remover_lata)
  167. btn_remover.pack(pady=5)
  168.  
  169. btn_zerar = tk.Button(janela, text="Zerar Contagem", command=zerar_contagem)
  170. btn_zerar.pack(pady=5)
  171.  
  172. btn_relatorio = tk.Button(janela, text="Mostrar Relatório", command=mostrar_relatorio)
  173. btn_relatorio.pack(pady=5)
  174.  
  175. btn_pdf = tk.Button(janela, text="Gerar PDF", command=gerar_pdf)
  176. btn_pdf.pack(pady=5)
  177.  
  178. btn_apagar = tk.Button(janela, text="Apagar Banco de Dados", command=apagar_dados)
  179. btn_apagar.pack(pady=5)
  180.  
  181. # Centralizando a janela
  182. janela.geometry("300x350")
  183. centralizar_janela(janela)
  184.  
  185. # Thread para o relógio
  186. thread_relogio = threading.Thread(target=atualizar_relogio, daemon=True)
  187. thread_relogio.start()
  188.  
  189. # Iniciando a aplicação
  190. janela.mainloop()
  191.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement