from tkinter import *
from collections import defaultdict
# Dados da Taça de Portugal (clube: [lista de anos no formato 1938–39])
taca_portugal = {
"Académica": ["1938–39", "2011–12"],
"Benfica": ["1939–40", "1942–43", "1943–44", "1948–49", "1950–51", "1951–52", "1952–53", "1954–55", "1956–57",
"1958–59", "1961–62", "1963–64", "1968–69", "1969–70", "1971–72", "1979–80", "1980–81", "1982–83",
"1984–85", "1985–86", "1986–87", "1992–93", "1995–96", "2003–04", "2013–14", "2016–17"],
"Sporting CP": ["1940–41", "1944–45", "1945–46", "1947–48", "1953–54", "1962–63", "1970–71", "1972–73", "1973–74",
"1977–78", "1981–82", "1994–95", "2001–02", "2006–07", "2007–08", "2014–15", "2018–19", "2024–25"],
"Belenenses": ["1941–42", "1959–60", "1988–89"],
"FC Porto": ["1955–56", "1957–58", "1967–68", "1983–84", "1987–88", "1989–90", "1993–94", "1997–98", "1999–00",
"2000–01", "2002–03", "2005–06", "2008–09", "2009–10", "2010–11", "2019–20", "2021–22", "2022–23",
"2023–24"],
"Leixões": ["1960–61"],
"Vitória FC (Vitória de Setúbal)": ["1964–65", "1966–67", "2004–05"],
"SC Braga": ["1965–66", "2015–16", "2020–21"],
"Boavista": ["1974–75", "1975–76", "1978–79", "1991–92", "1996–97"],
"Estrela da Amadora": ["1989–90"],
"Beira-Mar": ["1998–99"],
"Vitória SC (Vitória de Guimarães)": ["2012–13"],
"Desportivo das Aves": ["2017–18"]
}
# Campeões da Liga Portuguesa para detecção de dobradinhas
campeoes_liga = {
"Benfica": ["1939–40", "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", "2022–23"],
"Sporting CP": ["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–00", "2001–02",
"2020–21", "2023–24"],
"FC Porto": ["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"]
}
# Dados da Supertaça Cândido de Oliveira
supertaca = {
"Benfica": ["1985–86", "1989–90", "2005–06", "2014–15", "2016–17"],
"Sporting CP": ["1982–83", "1995–96", "2000–01", "2007–08", "2021–22"],
"FC Porto": ["1981–82", "1983–84", "1984–85", "1991–92", "1993–94", "1994–95", "1996–97", "1998–99", "1999–00",
"2001–02", "2003–04", "2006–07", "2009–10", "2010–11", "2011–12", "2012–13", "2013–14", "2017–18",
"2018–19", "2019–20", "2022–23"]
}
def sequencias_consecutivas(anos_lista):
if not anos_lista:
return {}
anos_convertidos = sorted(anos_lista, key=lambda a: int(a.split("–")[0]))
sequencias = []
atual = [anos_convertidos[0]]
for i in range(1, len(anos_convertidos)):
atual_ano = int(anos_convertidos[i].split("–")[0])
anterior_ano = int(anos_convertidos[i - 1].split("–")[0])
if atual_ano == anterior_ano + 1:
atual.append(anos_convertidos[i])
else:
if len(atual) >= 2:
sequencias.append(list(atual))
atual = [anos_convertidos[i]]
if len(atual) >= 2:
sequencias.append(atual)
tipos = defaultdict(list)
for seq in sequencias:
tipos[len(seq)].append(seq)
return tipos
def contar_dobradinhas(clube):
anos_taca = set(taca_portugal.get(clube, []))
anos_liga = set(campeoes_liga.get(clube, []))
return sorted(anos_taca & anos_liga)
# Interface gráfica
root = Tk()
root.geometry("900x600")
root.resizable(0, 0)
root.config(bg="#103030")
root.title("Taça de Portugal e mais")
Label(root, text="Campeões e títulos principais",
font=("Arial", 22, "bold"), bg="#103030", fg="#49e3e3").place(relx=0.25, rely=0.05)
var = StringVar()
dropDownList = list(taca_portugal.keys())
dropDownList.sort()
dropdown = OptionMenu(root, var, *dropDownList)
var.set(dropDownList[0])
dropdown.place(relx=0.25, rely=0.15, relwidth=0.5)
dropdown.config(background='#09A3BA', foreground="#FFFFFF", font=("Arial", 15, "bold"))
dropdown["menu"].config(background='#09A3BA', foreground="#FFFFFF", font=("Arial", 12, "bold"))
scrollbar = Scrollbar(root)
scrollbar.place(relx=0.95, rely=0.4, relheight=0.55)
resultado_texto = Text(root, font=("Arial", 11), bg="#cfe2f3", yscrollcommand=scrollbar.set, wrap=WORD)
resultado_texto.place(relx=0.05, rely=0.4, relwidth=0.9, relheight=0.55)
scrollbar.config(command=resultado_texto.yview)
def limpar():
resultado_texto.delete(1.0, END)
def app():
clube = var.get()
# Taça de Portugal
anos_taca = taca_portugal.get(clube, [])
total_taca = len(anos_taca)
# Liga Portuguesa
anos_liga = campeoes_liga.get(clube, [])
total_liga = len(anos_liga)
# Supertaça
anos_supertaca = supertaca.get(clube, [])
total_supertaca = len(anos_supertaca)
texto = f"{clube}:\n"
texto += f"Total de títulos da Taça de Portugal: {total_taca}\n"
texto += "Títulos da Taça de Portugal:\n"
texto += ", ".join(anos_taca) if anos_taca else "Nenhum"
texto += "\n\nConquistas consecutivas na Taça:\n"
conquistas_taca = sequencias_consecutivas(anos_taca)
nomes = {2: "Bi", 3: "Tri", 4: "Tetra", 5: "Penta", 6: "Hexa", 7: "Hepta", 8: "Octa"}
if conquistas_taca:
for k in sorted(conquistas_taca):
nome = nomes.get(k, f"{k}-campeonatos")
texto += f"\n{nome} ({len(conquistas_taca[k])}):"
for seq in conquistas_taca[k]:
texto += "\n - " + ", ".join(seq)
else:
texto += "Nenhuma"
texto += f"\n\nTotal de títulos da Liga Portuguesa: {total_liga}\n"
texto += "Títulos da Liga Portuguesa:\n"
texto += ", ".join(anos_liga) if anos_liga else "Nenhum"
texto += "\n\nConquistas consecutivas na Liga:\n"
conquistas_liga = sequencias_consecutivas(anos_liga)
if conquistas_liga:
for k in sorted(conquistas_liga):
nome = nomes.get(k, f"{k}-campeonatos")
texto += f"\n{nome} ({len(conquistas_liga[k])}):"
for seq in conquistas_liga[k]:
texto += "\n - " + ", ".join(seq)
else:
texto += "Nenhuma"
texto += f"\n\nTotal de títulos da Supertaça: {total_supertaca}\n"
texto += "Títulos da Supertaça:\n"
texto += ", ".join(anos_supertaca) if anos_supertaca else "Nenhum"
texto += "\n\nConquistas consecutivas na Supertaça:\n"
conquistas_supertaca = sequencias_consecutivas(anos_supertaca)
if conquistas_supertaca:
for k in sorted(conquistas_supertaca):
nome = nomes.get(k, f"{k}-campeonatos")
texto += f"\n{nome} ({len(conquistas_supertaca[k])}):"
for seq in conquistas_supertaca[k]:
texto += "\n - " + ", ".join(seq)
else:
texto += "Nenhuma"
# Dobradinhas Taça + Liga
dobradinhas = contar_dobradinhas(clube)
texto += f"\n\nDobradinhas (Taça + Campeonato): {len(dobradinhas)}"
if dobradinhas:
texto += "\n - " + ", ".join(dobradinhas)
resultado_texto.delete(1.0, END)
resultado_texto.insert(END, texto)
Button(root, text="Mostrar", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=app).place(relx=0.1, rely=0.3, relwidth=0.25, relheight=0.07)
Button(root, text="Limpar", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=limpar).place(relx=0.4, rely=0.3, relwidth=0.25, relheight=0.07)
Button(root, text="Sair", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=root.destroy).place(relx=0.7, rely=0.3, relwidth=0.25, relheight=0.07)
root.mainloop()