Azimlib0.3.0 · documentation

Teclado, mouse e atalhos no viewer Tk

O viewer interpreta os eventos com implementação própria. Matplotlib é apenas referência de desenvolvimento; nenhum normalizador/backend dele é importado em execução. O HTML portátil conserva seu sistema JavaScript e suas limitações; os contratos abaixo se referem ao Tk.

Eventos e propriedades

fig.canvas.mpl_connect(nome, callback) conecta uma função. O callback recebe um objeto com name, canvas, inaxes, x/y, xdata/ydata e guiEvent. Display usa pixels a partir do canto inferior esquerdo; x/y são inteiros, mas a inversa geográfica usa a posição original, antes de truncar. Fora de um mapa, inaxes e coordenadas geográficas são None.

Canal Propriedades e comportamento
key_press_event, key_release_event key normalizado: ctrl+s, P, enter, pageup, Unicode; mapa sob o cursor
button_press_event, button_release_event button em MouseButton, modifiers, dblclick; clique do meio também é informado
motion_notify_event buttons frozenset dos botões atualmente pressionados; button é o último press ainda sem release
scroll_event step fracionário, button='up'/'down', modifiers; delta zero não navega
figure_enter_event, figure_leave_event entrada/saída do canvas; sair limpa a mensagem de coordenadas
axes_enter_event, axes_leave_event mudança de mapa durante motion; sair do anterior precede entrar no novo
draw_event, resize_event, close_event cena desenhada, dimensão alterada e fechamento

Mouse usa modifiers como frozenset de nomes: ctrl, alt, shift e, conforme plataforma, cmd/super. Em teclado, os modificadores fazem parte de key; o campo modifiers permanece vazio, como na referência. A tecla pressionada também aparece em eventos de mouse até o release. Em axes_enter, o payload é o motion atual, inclusive event.name='motion_notify_event', como Matplotlib. Em axes_leave, o payload informa o Axes anterior e a posição atual do cursor.

from azimlib.backend_bases import MouseButton

def on_click(event):
    if event.inaxes is ax and event.button == MouseButton.LEFT:
        if 'ctrl' in event.modifiers:
            print(event.xdata, event.ydata)

cid = fig.canvas.mpl_connect('button_press_event', on_click)
# fig.canvas.mpl_disconnect(cid)

MouseButton possui LEFT=1, MIDDLE=2, RIGHT=3, BACK=8 e FORWARD=9 e continua comparável com inteiros. Botões 2/3 e máscaras têm a conversão própria de Tk em macOS. Botões extras só funcionam quando o sistema/Tk os entrega. Isso não implementa as classes MouseEvent/KeyEvent/LocationEvent completas.

Atalhos configuráveis

rcParam Default
keymap.home h, r, home
keymap.back left, c, backspace, MouseButton.BACK
keymap.forward right, v, MouseButton.FORWARD
keymap.pan p
keymap.zoom o
keymap.save s, ctrl+s
keymap.fullscreen f, ctrl+f
keymap.quit ctrl+w, cmd+w, q
keymap.grid g
keymap.grid_minor G

Maiúsculas e modificadores são significativos: P e Ctrl+P não ativam pan por padrão. Escape não fecha a janela por padrão. A grade maior, com g, percorre desligada → X → X+Y → Y → desligada. G percorre o mesmo ciclo para as grades maior+menor. Desligar uma grade maior desliga também sua menor. Atalhos de grade só atuam sobre o mapa sob o cursor; a grade continua opcional/desligada por padrão. +/- e roda são conveniências próprias de zoom, além da toolbar.

import azimlib as azl

with azl.rc_context({'keymap.pan': ['ctrl+p'], 'keymap.save': []}):
    fig, ax = azl.subplots()
    ax.map('brazil')
    azl.show()

As configurações são lidas ao receber cada evento: mantenha o contexto ativo durante o viewer. Listas são copiadas e validação de update é prospectiva; [] desativa um atalho. O exemplo interativo conecta clique com Ctrl a uma annotation e alterna legenda/escala/norte/rosa individualmente, sem substituir os componentes uns pelos outros.

Evidência e limites

Contratos registrados de Matplotlib 3.11.2/TkAgg: 60 teclas, 36 estados de máscaras, 15 botões, 10 transições, oito passos de grade e dez keymaps. A execução usou Tk real oculto no Windows; as tabelas Linux/macOS foram examinadas substituindo o identificador de plataforma durante a chamada ao normalizador instalado. Isso não valida input nativo nesses sistemas. O smoke próprio de doze cenários passou em Tk real oculto com inputs sintéticos, também no wheel instalado sem Matplotlib/GIS. O exemplo de componentes/Ctrl+clique passou nesse ambiente, incluindo exportação SVG.

Ainda faltam picking/selectors, hierarquia completa de classes de eventos, mouse grab, foco em insets/colorbars, transições entre janelas diferentes, política geral de exceções de callbacks e integração incremental. Existem diferenças: eventos guardam o guiEvent depois da chamada; key_press é entregue antes do atalho da toolbar; configurações duplicadas usam a prioridade local; não há visibilidade individual de cada linha de tick para o caso misto de grid. Atalhos de escalas logarítmicas, clipboard/help/quit_all não são implementados. Conferência visual/input nativo e CI remota continuam pendentes. Veja validação desktop; não se declara equivalência integral.