Mundo em Python

Leitura de Tarot

from dataclasses import dataclass
import random
from typing import List
from tkinter import *
from tkinter import messagebox # ----------------------------- Definições do baralho -----------------------------
MAJOR_ARCANA = [
"O Mago", "A Sacerdotisa", "A Imperatriz", "O Imperador", "O Hierofante",
"Os Amantes", "O Carro", "A Força", "O Eremita", "A Roda da Fortuna",
"A Justiça", "O Enforcado", "A Morte", "A Temperança", "O Diabo",
"A Torre", "A Estrela", "A Lua", "O Sol", "O Julgamento", "O Mundo"
] NAIPES = ["Paus", "Copas", "Espadas", "Ouros"]
NUMEROS = ["Ás", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
CORTE = ["Pajem", "Cavaleiro", "Rainha", "Rei"] def construir_baralho() -> List[str]:
baralho = []
for nome in MAJOR_ARCANA:
baralho.append(nome)
for naipe in NAIPES:
for numero in NUMEROS:
baralho.append(f"{numero} de {naipe}")
for figura in CORTE:
baralho.append(f"{figura} de {naipe}")
return baralho # ----------------------------- Significados (resumidos) -----------------------------
SIGNIFICADOS_MAIORES = {
"O Mago": "Habilidade, iniciativa, novos começos.",
"A Sacerdotisa": "Intuição, mistério, sabedoria interior.",
"A Imperatriz": "Fertilidade, criatividade, abundância.",
"O Imperador": "Autoridade, estrutura, estabilidade.",
"O Hierofante": "Tradição, ensino, autoridade espiritual.",
"Os Amantes": "Relacionamentos, escolhas importantes, união.",
"O Carro": "Determinação, vitória, avanço controlado.",
"A Força": "Coragem, autocontrolo, compaixão aplicada.",
"O Eremita": "Busca interior, solidão necessária, sabedoria.",
"A Roda da Fortuna": "Mudança de ciclo, destino, altos e baixos.",
"A Justiça": "Equilíbrio, verdade, consequências.",
"O Enforcado": "Sacrifício, nova perspetiva, pausa necessária.",
"A Morte": "Fim que abre espaço para recomeço, transformação.",
"A Temperança": "Moderação, cura, integração de opostos.",
"O Diabo": "Apego, tentação, padrões limitantes.",
"A Torre": "Rutura súbita, revelação, reconstrução.",
"A Estrela": "Esperança, cura, inspiração.",
"A Lua": "Ilusões, intuição profunda, confusão temporária.",
"O Sol": "Clareza, sucesso, alegria.",
"O Julgamento": "Despertar, avaliação, chamada à mudança.",
"O Mundo": "Conclusão bem-sucedida, realização, integração.",
} SIGNIFICADOS_NAIPES = {
"Paus": "ação, criatividade, trabalho, energia",
"Copas": "emoções, relacionamentos, intuição",
"Espadas": "intelecto, conflitos, decisões",
"Ouros": "matéria, finanças, corpo, segurança",
} SIGNIFICADOS_NUMEROS = {
"Ás": "novo começo, potencial puro",
"2": "parceria, escolha, equilíbrio",
"3": "expressão social, colaboração, resultado inicial",
"4": "estabilidade, estrutura, pausa",
"5": "conflito, desafio, mudança de energia",
"6": "harmonia, ajuda, recordação do passado",
"7": "defesa, perseverança, avaliação",
"8": "rapidez, movimento, esforço concentrado",
"9": "aproximação do objetivo, resiliência",
"10": "conclusão de ciclo, responsabilidade completa",
"Pajem": "mensagem, início de aprendizagem, curiosidade",
"Cavaleiro": "ação direcionada, movimento em direção a algo",
"Rainha": "maturidade, domínio emocional ou temático do naipe",
"Rei": "autoridade prática do naipe, liderança",
} @dataclass
class CartaTirada:
nome: str
invertida: bool

def tirar_cartas(baralho: List[str], n: int = 1) -> List[CartaTirada]:
escolhidas = random.sample(baralho, n)
resultado = []
for c in escolhidas:
inv = random.random() < 0.5
resultado.append(CartaTirada(nome=c, invertida=inv))
return resultado def interpretar(carta: CartaTirada) -> str:
nome = carta.nome
if nome in SIGNIFICADOS_MAIORES:
significado = SIGNIFICADOS_MAIORES[nome]
else:
partes = nome.split(" de ")
if len(partes) == 2:
valor, naipe = partes
signif_naipe = SIGNIFICADOS_NAIPES.get(naipe, "")
signif_valor = SIGNIFICADOS_NUMEROS.get(valor, "")
significado = f"{signif_valor} relacionado com {signif_naipe}."
else:
significado = "Significado genérico."

if carta.invertida:
return f"(Invertida) {significado} — indica bloqueio, atraso ou energia interior não expressa."
else:
return significado TIRAGENS = {
"1": {
"nome": "Carta única",
"posicoes": ["Mensagem do dia / foco principal"]
},
"3": {
"nome": "Três cartas",
"posicoes": ["Passado", "Presente", "Futuro"]
},
"5": {
"nome": "Cinco cartas",
"posicoes": ["Base", "Desafio", "Caminho", "Ambiente", "Conselho"]
},
"10": {
"nome": "Cruz Celta (simplificada)",
"posicoes": [
"Situação", "Desafio", "Base", "Passado recente", "Objetivo/Consciência",
"Futuro próximo", "Eu (ou atitude)", "Ambiente", "Esperanças/Medos", "Resultado"
]
}
} # ----------------------------- Interface Tkinter -----------------------------
def realizar_tiragem(tipo):
baralho = construir_baralho()
posicoes = TIRAGENS[tipo]['posicoes']
cartas = tirar_cartas(baralho, len(posicoes))
resultado = ""
for pos, carta in zip(posicoes, cartas):
inv = " (invertida)" if carta.invertida else ""
resultado += f"\n{pos}: {carta.nome}{inv}\n{interpretar(carta)}\n"
messagebox.showinfo(f"Tiragem: {TIRAGENS[tipo]['nome']}", resultado) # Criação da janela principal
root = Tk()
root.geometry("700x500")
root.resizable(0, 0)
root.config(bg="#103030")
root.title("Leitura de Tarot") # Título
titulo = Label(root, text="Bem-vindo ao Tarot",
font=("Arial", 28, "bold"), bg="#103030", fg="#49e3e3")
titulo.place(relx=0.22, rely=0.05) texto_sub1 = Label(root, text="Escolha uma tiragem:",
font=("Arial", 18, "bold"), bg="#103030", fg="#49e3e3")
texto_sub1.place(relx=0.25, rely=0.25) # Botões de tiragem
Button(root, text="1 Carta", font=("Arial", 14, "bold"),
bg="#49e3e3", fg="#103030", width=12,
command=lambda: realizar_tiragem("1")).place(relx=0.18, rely=0.45) Button(root, text="3 Cartas", font=("Arial", 14, "bold"),
bg="#49e3e3", fg="#103030", width=12,
command=lambda: realizar_tiragem("3")).place(relx=0.38, rely=0.45) Button(root, text="5 Cartas", font=("Arial", 14, "bold"),
bg="#49e3e3", fg="#103030", width=12,
command=lambda: realizar_tiragem("5")).place(relx=0.58, rely=0.45) # Botão sair
Button(root, text="Sair", font=("Arial", 12, "bold"),
bg="#802020", fg="white", width=10,
command=root.destroy).place(relx=0.8, rely=0.85) root.mainloop()
0