Diálogos são interessantes para introduzir uma
resposta simples do usuário, ou para confirmar uma operação que está para ser
realizada. Alguns comandos pré-definidos do tk nos fornecem os diálogos mais
comuns, bem como browsers de arquivos e cores, como também para criar
menus popup: tk_dialog, tk_messageBox, tk_getOpenFile, tk_getSaveFile,
tk_chooseColor, tk_optionMenu, tk_popup. Estes comandos são
simplesmente scripts localizados no diretório reservado para a biblioteca do
tk, normalmente /usr/local/lib/tk8.0. Entretanto, como estes
comandos criam novos toplevels quando executados, não é possível mostrá-los
como tclets, voce terá que executá-los em seu próprio ambiente.
Até agora vimos GUIs criadas só visualmente com o visual tcl,
mas agora que voce já está se familiarizando com os widgets do tcl/tk, tenho
uma boa nova: para cada widget, existe um comando que cria um widget, sem a
necessidade desse editor visual. E o melhor é que este comando é o nome do
próprio widget! Por exemplo, para criar um botão, usamos o
comando button, para criar um frame, o comando
frame, e assim por diante. Os atributos desses widgets têm
exatamente os nome encontrados no visual tcl, mas como são
opções do comando, são representados com um hífen "-"
prefixando-os. Vejamos, como exemplo, como criar um botão que, ao pressionado,
imprima na console (que o executou) a famosa mensagem "Alô mundo!":
button .b -text Alô -command {puts "Alô mundo!"}
Observe atentamente o código gerado pelo visual tcl quando voce salva uma interface. Ela conterá uma série de comandos como esse para cada widget criado.
|
O tk pode produzir diálogos modais, com bitmaps a serem escolhidos pelo
programador, mensagens e botões. O diálogo ao lado foi criado com o
comando:
|
Um diálogo que nos fornece um "file browser", com seleção de tipos de
arquivos definíveis pelo programador, "file default", extensão
default, etc., chamado tk_getOpenFile. O diálogo
complementar tk_getSaveFile fornece propriedades semelhantes para
nomes de arquivos a salvar.
|
|
|
Nosso primeiro exemplo usa dois widgets, uma mensagem (message)
na parte superior e uma entrada (entry) na parte inferior,
arrajados com o pack. Inicialmente definimos os dois widgets,
fornecendo os parâmetros desejados. No caso da mensagem, o texto (opção
-text) que será mostrado. No caso da entrada, uma variável
associada (com o atributo -textvariable), que será mostrada nesse
widget, quando for modificada. Eventualmente, uma entry é usada mais para
entrada de dados, mas ela se presta bem ao que queremos mostrar.
Para arranjar e visualizar os widgets, usamos o pack, com opções
para manter um espaçamento externo em cada widget de 5 pixels na direção x e
10 na direção y. Estas opções são -padx e -pady. De
outra forma os widgets gerenciados pelo pack ficariam "colados" um no outro,
sem espaço entre eles, ou entre eles e a borda externa do toplevel.
Nossa aplicação irá mostrar um menu popup, criado pelo comando
tk_optionMenu, que conterá nomes de algumas frutas que queremos
que o usuário escolha. O comando tk_optionMenu espera como
argumentos: nome do widget (menubutton) a ser criado, nome da
variável onde armazenar a seleção, e demais argumentos são as opções do menu.
Devemos salvar o menu retornado numa variável para chamá-lo posteriormente.
Poderíamos também mapear o menubutton criado diretamente, usando
o pack ou outro gerenciador de geometria.
Finalmente, definiremos um binding (comando bind) para
toda a janela (usando o toplevel "." } quando o evento desejado
ocorrer. Para representar um evento "botão de mouse", usamos o númreo deste
botão entre "<" e ">". O próximo argumento é um
comando que deverá ser executado quando as condições desse binding
forem satisfeitas. Aí entra o comando tk_popup, para mostrar o
nosso menu. Ele espera como argumentos o menu e a posição x e y aonde deverá
ser mostrado o menu. Faremos o nosso menu "aparecer" no local aonde o mouse
foi clicado. Obtemos essa posição com o comando winfo pointerx .
(para a coordenada x), e similarmente para a coordenada y.
#!/bin/sh
# A linha seguinte executa o interpretador \
exec wish "$0" "$@"
message .msg -text { Clicando o botão 1 do mouse \
nesta janela, voce verá um menu com vários \
radiobuttons, criado com o comando \
tk_optionMenu e invocado com tk_popup.
A entry abaixo mostrará o valor \
corrente da variável "fruta" \
selecionada.}
entry .fruta -textvariable fruta
pack .msg .fruta -padx 5 -pady 10
set fmenu [tk_optionMenu .mfru fruta \
manga goiaba banana uva]
bind . <1> { tk_popup $fmenu \
[winfo pointerx .] [winfo pointery .] }
|
Infelizmente, esse programa não funciona como tclet, pois utiliza
menus, o que seria uma quebra de segurança, como discutimos anteriormente.
Salve o código ao lado em um arquivo e execute-o diretamente (não esqueça
primeiro " |
Experimente usar o menubutton criado suprimindo o comando
bind e fazendo:
pack .mfru
selecione as opções (frutas) e veja o que acontece com a legenda no botão.
Podemos adicionar comportamento na forma de respostas a eventos a qualquer
objeto de nossa interface. Um exemplo é o resultado do comando
bind acima, em resposta ao evento botão de mouse
<1>. Em geral, temos uma sequência de eventos invocando um
comando, na forma genérica: bind tag sequência comando. O
tag pode representar uma instância de um widget, como no exemplo
acima, fornecendo o nome explícito do widget; ou pode ser toda uma classe, por
exemplo Frame, Button, Label, etc, quando definimos o nome da
classe de objetos (widgets) com a primeira letra maiúscula; ou ainda a palavra
all, representando todos as janelas (widgets) da aplicação. A
sequência pode ser o número de um botão do mouse, uma tecla, ou eventos
especiais como Activate, Circulate, Colormap, Configure, Deactivate,
Destroy, Enter, Expose, FocusIn, FocusOut, Gravity, Motion, Leave, Map,
Property, Reparent, Unmap, Visibility, representando eventos gerados
pelo sistema de janelas X com relação às janelas. Estes eventos podem ser
prefixados por modificadores que indicam situações, como espécie de filtros,
sob as quais os eventos são válidos, tais como: Control, Shift, Lock,
Alt, Meta, Double, Triple. Por exemplo, <Control-1>
define o evento "botão do mouse 1 cvom tecla Control
pressionada", <Double-Alt-2> define "dois cliques no botão do
meio do mouse com a tecla Alt pressionada",
<Shift-Enter> define o evento "entrando no widget com a tecla
Shift pressionada" e assim por diante. Algumas teclas têm
nomes especiais, como Return (não exatamente o Enter usado pelo
MS-Windows), Backspace, Shift_L, Insert, Delete, Prior, Next. Use
o programa abaixo para descobrir todos os nomes ou consulte o arquivo
/usr/include/X11/keysymdef.
O tclet ao lado é um simples text com os bindings alterados para nos mostrar alguns eventos que podem ocorrer. Quando "entramos" no widget, o Enter, quando saimos o Leave, cada botão do mouse pressionado ou liberado, e teclas. Experimente! Veja também que algumas teclas têm nomes especiais, como o Shift, Control e Alt. No comando usamos %K para obter esses nomes. |
|