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"""

{classe}

Classe na VerbNet:  {classe}

Papéis Temáticos:  {" ".join(papeis)}

Membros: {", ".join(verbos)}

""" for alt, ping, sing in frames_rows: html += f"" html += "
VerbNet.Br VerbNet
{alt}{ping} - {sing}
" return html def carregar_html(nome_arquivo): if os.path.exists(nome_arquivo): with open(nome_arquivo, "r", encoding="utf-8") as f: return f.read() return f"

Arquivo {nome_arquivo} não encontrado.

" # --- Interface Gradio --- with gr.Blocks(css=css, head=head_content) as demo: gr.HTML('

VerbNet.Br 1.0

') with gr.Tabs(): with gr.TabItem("Home"): gr.HTML(carregar_html("index.html")) with gr.TabItem("Busca"): with gr.Column(elem_classes="container content-area"): # --- NOVO: Campo de busca por texto (idêntico à imagem) --- with gr.Column(elem_classes="search-container"): gr.HTML('

Digite parte de um verbo ou de uma classe da VerbNet.Br:

') with gr.Row(): input_texto = gr.Textbox(show_label=False, placeholder="Ex: correr, consider...", scale=4) btn_buscar = gr.Button("Buscar", variant="primary", scale=1) # Botões de Letras 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()