import gradio as gr import sqlite3 import os DB = "verbnetbr.db" head_content = """ """ # --- Estilos CSS Customizados --- css = """ .top-header { background-color: #f8f9fa; border-bottom: 1px solid #dee2e6; } .site-title { font-weight: bold; color: #114278 !important; margin: 0; } .content-area { padding: 30px 10px; min-height: 400px; color: #212529 !important; } /* Garante que o fundo do Gradio não fique preto no celular */ .gradio-container { background-color: white !important; } """ # --- Funções de Base de Dados --- def buscar_por_texto(termo): if not termo or len(termo.strip()) < 2: return [["Aviso", "Digite pelo menos 2 caracteres para buscar."]] con = sqlite3.connect(DB) cur = con.cursor() # Busca por parte do verbo OU parte da classe query = """ SELECT verbo, classe FROM candidatos WHERE (verbo LIKE ? OR classe LIKE ?) AND exp1=1 ORDER BY verbo """ cur.execute(query, (f'%{termo}%', f'%{termo}%')) rows = cur.fetchall() con.close() return [list(r) for r in rows] if rows else [["-", "Nenhum resultado encontrado"]] def buscar_por_letra(letra): con = sqlite3.connect(DB) cur = con.cursor() cur.execute("SELECT verbo, classe FROM candidatos WHERE verbo LIKE ? AND exp1=1 ORDER BY verbo", (letra+'%',)) rows = cur.fetchall() con.close() return [list(r) for r in rows] def buscar_todas_classes(): con = sqlite3.connect(DB) cur = con.cursor() cur.execute("SELECT DISTINCT classe FROM candidatos WHERE exp1=1 ORDER BY classe") rows = cur.fetchall() con.close() return [["-", r[0]] for r in rows] def buscar_detalhes(evt: gr.SelectData): # evt.index[1] é o índice da coluna. 0 = Verbo, 1 = Classe. if evt.index[1] == 0: return gr.update() # Não faz nada se clicar na coluna do Verbo classe = evt.value if classe in ["-", "Nenhum resultado encontrado", "Aviso", ""]: return "" con = sqlite3.connect(DB) cur = con.cursor() cur.execute("SELECT verbo FROM candidatos WHERE classe = ? AND exp1=1", (classe,)) verbos = [r[0] for r in cur.fetchall()] cur.execute("SELECT papel FROM papeis WHERE classe = ?", (classe,)) papeis = [r[0] for r in cur.fetchall()] cur.execute("SELECT alternancia, pingles, singles FROM classes WHERE classe = ?", (classe,)) frames_rows = cur.fetchall() con.close() html = f"""
| VerbNet.Br | VerbNet | |
|---|---|---|
| {alt} | {ping} - {sing} |
Arquivo {nome_arquivo} não encontrado.
" # --- Interface Gradio --- with gr.Blocks(css=css, head=head_content) as demo: gr.HTML('Ou selecione pela letra inicial do verbo:
') with gr.Row(): letras = "ABCDEFGHILMNOPQRSTUVXZ" btns_alfabeto = [gr.Button(l, elem_classes="alphabet-btn", min_width=35) for l in letras] btn_todas = gr.Button("Ver Todas as Classes da VerbNet.Br", variant="secondary") saida_letra = gr.Dataframe(headers=["Verbo", "Classe"], interactive=False) saida_classe = gr.HTML() with gr.TabItem("Publicações"): gr.HTML(carregar_html("publicacoes.html")) with gr.TabItem("Contato"): gr.HTML(carregar_html("contato.html")) # --- Eventos --- # Busca por texto (Enter ou Botão) btn_buscar.click(fn=buscar_por_texto, inputs=input_texto, outputs=saida_letra) input_texto.submit(fn=buscar_por_texto, inputs=input_texto, outputs=saida_letra) # Letras e Ver Todas for btn, letra in zip(btns_alfabeto, letras): btn.click(fn=lambda l=letra: buscar_por_letra(l), outputs=saida_letra) btn_todas.click(fn=buscar_todas_classes, outputs=saida_letra) saida_letra.select(fn=buscar_detalhes, outputs=saida_classe) if __name__ == "__main__": demo.launch()