Mundo em Python

Campeões da Primeira Liga portuguesa

from tkinter import *
from collections import defaultdict # Dados
titulos = {
"Benfica": {
"quantidade": 38,
"anos": [
"1935–36", "1936–37", "1937–38", "1941–42", "1942–43", "1944–45",
"1949–50", "1954–55", "1956–57", "1959–60", "1960–61", "1962–63",
"1963–64", "1964–65", "1966–67", "1967–68", "1968–69", "1970–71",
"1971–72", "1972–73", "1974–75", "1975–76", "1976–77", "1980–81",
"1982–83", "1983–84", "1986–87", "1988–89", "1990–91", "1993–94",
"2004–05", "2009–10", "2013–14", "2014–15", "2015–16", "2016–17",
"2018–19", "2022–23"
]
},
"FC Porto": {
"quantidade": 30,
"anos": [
"1934–35", "1938–39", "1939–40", "1955–56", "1958–59", "1977–78",
"1978–79", "1984–85", "1985–86", "1987–88", "1989–90", "1991–92",
"1992–93", "1994–95", "1995–96", "1996–97", "1997–98", "1998–99",
"2002–03", "2003–04", "2005–06", "2006–07", "2007–08", "2008–09",
"2010–11", "2011–12", "2012–13", "2017–18", "2019–20", "2021–22"
]
},
"Sporting CP": {
"quantidade": 21,
"anos": [
"1940–41", "1943–44", "1946–47", "1947–48", "1948–49", "1950–51",
"1951–52", "1952–53", "1953–54", "1957–58", "1961–62", "1965–66",
"1969–70", "1973–74", "1979–80", "1981–82", "1999–2000", "2001–02",
"2020–21", "2023–24", "2024–25"
]
},
"Belenenses": {
"quantidade": 1,
"anos": ["1945–46"]
},
"Boavista": {
"quantidade": 1,
"anos": ["2000–01"]
}
} # Função para normalizar e extrair os anos corretamente
def parse_epoca(epoca):
epoca = epoca.replace("–", "-") # converte en dash para traço comum
inicio_str, fim_str = epoca.split("-")
inicio = int(inicio_str)
if len(fim_str) == 2:
fim = (inicio // 100) * 100 + int(fim_str)
if fim < inicio:
fim += 100
else:
fim = int(fim_str)
return (epoca.replace("-", "–"), inicio) # Função que detecta sequências de campeonatos consecutivos
def sequencias_consecutivas(anos_formatados):
epocas_processadas = [parse_epoca(epoca) for epoca in anos_formatados]
epocas_ordenadas = sorted(epocas_processadas, key=lambda x: x[1]) sequencias = []
atual = [epocas_ordenadas[0]] for i in range(1, len(epocas_ordenadas)):
if epocas_ordenadas[i][1] == epocas_ordenadas[i - 1][1] + 1:
atual.append(epocas_ordenadas[i])
else:
if len(atual) >= 2:
sequencias.append([e[0] for e in atual])
atual = [epocas_ordenadas[i]] if len(atual) >= 2:
sequencias.append([e[0] for e in atual]) tipos = defaultdict(list)
for seq in sequencias:
tipos[len(seq)].append(seq) return tipos # Interface gráfica
root = Tk()
root.geometry("800x500")
root.resizable(0, 0)
root.config(bg="#103030")
root.title("Campeões da Primeira Liga portuguesa") titulo = Label(text="Campeões da Primeira Liga portuguesa",
font=("Arial", 22, "bold"), bg="#103030", fg="#49e3e3")
titulo.place(relx=0.15, rely=0.05) var = StringVar()
dropDownList = list(titulos.keys())
dropdown = OptionMenu(root, var, *dropDownList)
var.set(dropDownList[0])
dropdown.place(relx=0.25, rely=0.2, relwidth=0.5)
dropdown.config(background='#09A3BA', foreground="#FFFFFF", font=("Arial", 15, "bold"))
dropdown["menu"].config(background='#09A3BA', foreground="#FFFFFF", font=("Arial", 12, "bold")) # Área de texto com scroll
scrollbar = Scrollbar(root)
scrollbar.place(relx=0.95, rely=0.45, relheight=0.5) resultado_texto = Text(root, font=("Arial", 11), bg="#cfe2f3", yscrollcommand=scrollbar.set, wrap=WORD)
resultado_texto.place(relx=0.05, rely=0.45, relwidth=0.9, relheight=0.5)
scrollbar.config(command=resultado_texto.yview) # Funções dos botões
def limpar():
resultado_texto.delete(1.0, END) def app():
equipa = var.get()
dados = titulos[equipa]
anos = dados["anos"]
total = dados["quantidade"] texto = f"{equipa}:\nTotal de títulos: {total}\n\nTítulos:\n"
texto += ", ".join(anos)
texto += "\n\nConquistas consecutivas:\n"

conquistas = sequencias_consecutivas(anos)
nomes = {2: "Bi", 3: "Tri", 4: "Tetra", 5: "Penta", 6: "Hexa", 7: "Hepta", 8: "Octa"}
for k in sorted(conquistas):
nome = nomes.get(k, f"{k}-campeonatos")
texto += f"\n{nome} ({len(conquistas[k])}):"
for seq in conquistas[k]:
texto += "\n - " + ", ".join(seq) resultado_texto.delete(1.0, END)
resultado_texto.insert(END, texto) # Botões
but1 = Button(text="Mostrar", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=app)
but1.place(relx=0.1, rely=0.33, relwidth=0.25, relheight=0.07) but_limpar = Button(text="Limpar", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=limpar)
but_limpar.place(relx=0.4, rely=0.33, relwidth=0.25, relheight=0.07) but_sair = Button(text="Sair", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=root.destroy)
but_sair.place(relx=0.7, rely=0.33, relwidth=0.25, relheight=0.07) root.mainloop()
0