Capítulo 9

anterior sumario proximo

Qualquer programa visual que se preze precisa ter mais de uma forma para executar cada função. A forma alternativa predileta, para usuários perdidos é através de um menu. Em tcl/tk os menus são na verdade formados por widgets distintos: menu e menubutton. O primeiro é o menu propriamente dito, que se apresenta semelhante a um toplevel, mas aparecendo em locais controlados; o segundo é um tipo de botão diferente, especializado em disparar menus, apesar de que podemos ter menus sem menubuttons.

Um menu típico de aplicação aparece como o tclet ao lado. Neste menu, nenhuma ação é executada, mas somente impresso no text widget um texto referente à ação. Devido a limitações (segurança) no tcl-plugin, você não poderá criar este tclets com menu e menubutton, somente simulado como este ao lado. Temos os seguintes tipos de ítens de menus: command, cascade, checkbutton, radiobutton, separator e tearoff (mas nem todos são mostrados no tclet ao lado).

As novas versões (a partir da 8.0) do tcl/tk podem apresentar de maneira muito simples um menu no toplevel da aplicação, com a opção -menu <nome do menu>. Versões anteriores precisavam que fosse definido explicitamente os menubuttons e possivelmente um frame para conter todos eles, além do comando para gerenciar a geometria (usualmente o pack).

Vejamos como poderíamos criar um menu semelhante ao mostrado no tclet. Inicialmente criamos o menu e em seguida configuramos o toplevel para usá-lo como menu principal:

menu .main -type menubar
. config -menu .main
A opção -type menubar indica que este menu será usado como toolbar, ou seja, a barra de menu principal no toplevel.
Em seguida podemos adicionar ítens a esse menu com subcomandos add cascade do menu já existente:
.main add cascade -label Arquivo -underline 0 \
	-menu .main.arquivo
.main add cascade -label Edita -underline 0 \
	-menu .main.edita
Neste comando, a opção -label Arquivo indica o nome que será mostrado, a opção -underline 0 indica qual caracter deste label será sublinhado (espécie de atalho), e a opção -menu .main.arquivo define outro menu que será usado para as operações desse tipo (submenu).
O menu main conterá somente ítens do tipo cascade, pois ele será responsável apenas em chamar os outros menus. Nos menus .main.arquivo e .main.edita teremos outros tipos de ítens:
menu .main.arquivo
menu .main.edita
.main.arquivo add command -label Open \
	-command {puts "Open file"} -underline 0
.main.arquivo add command -label Close \
	-command {puts "Close file"}
.main.arquivo add separator
.main.arquivo add checkbutton -label pRinter \
	-variable todevice -underline 1
.main.arquivo add command -label Print 
	-underline 0 -command {
	if {$todevice} {
		puts "send to printer"
	} else {
		puts "send to file"
	} 
}
A escolha do ítem do menu a ser invocado pode ser feita digitando o caracter sublinhado. Para isso, devemos ter o cuidado de não usar o mesmo caracter em dois ítens diferentes. No menu principal, o caracter sublinhado permite a execução com a combinação Alt-<tecla>. Podemos também definir aceleradores com -accelerator teclas onde teclas indica a sequência de teclas a ser acionada. Esse texto aparecerá à direita do ítem, mas a sua invocação não é automática, devendo ser programada por um comando bind, que foi visto anteriormente.

Complete a definição dos menus acima para conter todos os comandos apresentados no tclet do início deste capítulo.

Uma entrada (entry em inglês) pode ter um bitmap ou uma imagem (colorida) no lugar do seu label usual. Basta usarmos a opção -bitmap ou -image para definir o seu conteúdo. No caso de imagens, ela deverá ser criada previamente com o comando image create photo <nome da imagem> -file <arquivo.gif> e o nome da imagem será usado com a opção acima.
Observe que somente arquivos gif ou pnm (formato usado mais com o Unix/Linux) poderão ser usados para isso. Com a extensão Img para o tcl/tk, podemos empregar outros tipos de imagens, mas isso foge ao nosso propósito atual

menu com imagens

Veja um fragmento do código usado para definir este menu:

image create photo book2 -data "
R0lGODlhEAAOAPIFAAAAAFxcXIeHh76+vv///76+vgAAAAAAACH5BAEAAAUAIf4pICBJbXBv
cnRlZCBmcm9tIFhQTSBpbWFnZTogbWluaS1ib29rMi54cG0ALAAAAAAQAA4AwgAAAFxcXIeH
h76+vv///76+vgAAAAAAAAPIWAVQVaWUUkoppQBBCAEEQRBAABRFAQQEQQAEQRBAABRFURQF
AAgAAAAAAAAKhQJAQCAACgAAgQAoFAqFAkBAIBAABAKBABAACoVCoQAIEAAEAIBAEAAKhQIg
QAAUCgUFAAAABQUFBQUAAgQEBAABBAQEAAAABQUFAAIEBAQAAQQEBAACAAUFBQABBAQEAAIE
BAQAAgAFBQUFAAIEBAABBAQAAAIABQUFBQUFAAIAAAIBAgIBAAUFBQUFBQUAAAUFBQUFBQUF
BQkAOw=="
image create photo clock -data "
R0lGODlhEAAOAPIEAAAAAL6+vtPT0////76+vgAAAAAAAAAAACH5BAEAAAQAIf4pICBJbXBv
cnRlZCBmcm9tIFhQTSBpbWFnZTogbWluaS1jbG9jay54cG0ALAAAAAAQAA4AwgAAAL6+vtPT
0////76+vgAAAAAAAAAAAAPISEREBAAAQAghhBAwxhgDMADDMAAEQQDDMAwDMAzDMAAEQRAE
QQAAAABAIBAIBAKBABAMBgPAYDAQAAgEAgEwGAwGAMBgMBgMAAQCgQAQDAaDwWAwEAAIBAKB
QAAABgMDAwMAAAQEBAQEBAADAwMDAAMDAwMABAQEBAADAwMDAwADAwMDAwAEBAQAAwMDAwMA
AAMDAwMABAQEBAADAwMDAwMDAwMABAQEBAQEAAADAwMDAwAABAQEBAQEBAQEBAQEBAQEBAQE
BAkAOw=="

.m add cascade -image book2 -menu .m1
.m add cascade -image clock -menu .m2
.m add cascade -image camera -menu .m3
.m add cascade -label Opcões

menu .m1
.m1 add command -label open
.m1 add command -label close
.m1 add command -label exit -command exit

menu .m2
.m2 add command -image pencil
.m2 add command -image paint 

Uma entrada de um menu pode ser temporariamente desativada, como também ativada controlada pelo programa. Para isso usamos o comando da instância entryconfig -state disabled onde o index é a entrada à qual nos referimos, ou um padrão (tipo wildcard) com o label que ela contém. Vejamos um exemplo, com o menu dado no nosso primeiro exemplo. Suponhamos que queremos desativar a entrada Print, então faremos: .main.arquivo entryconfig Pr* -state disabled

O visual tcl possui um editor para menus que simplifica muito a implementação de menus (por não precisarmos memorizar as opções existentes). Caso seja interessante ter um editor de menus independente, menued (por Ken Corey) é um pequeno programa especializado para isso.

vtcl - menu edit O editor de menus do visual tcl é bem fácil de usar, caso a aplicação que voce esteja desenvolvendo já seja programada com esta ferramenta. (ao lado)
Caso contrário, um editor standalone interessante é o menuedit (figura abaixo).
menuedit

Podemos adicionar ou retirar entradas nos menus com os comandos insert e delete, além do comando add, que foi visto anteriormente. Estes dois permitem maior controle sobre onde queremos que nossa entrada apareça, e assim definir, por exemplo, uma lista dos últimos arquivos visitados numa aplicação. Uma entrada tearoff (que foi mencionada no início deste capítulo) pode ser definida somente no instante da criação do menu, e terá sempre o index 0. Ela aparece como uma linha tracejada no topo d÷ menu. Sua finalidade é permitir que o menu seja "destacado" numa janela independente, separada do toplevel da aplicação. Isso é conveniente, por exemplo, em paletas de cores, fontes de caracteres, ou quaisqer ítens que desejamos modificar constantemente, e não gostaríamos de ficar movendo o mouse até o menubar. O default é o que o tearoff seja habilitado; precisamos fazer -tearoff 0 para evitar o seu uso (mas não podemos retirar essa entrada, uma vez criada).


rpragana Thu Jun 3 11:30:23 EST 1999