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 .mainA opção -type menubar indica que este menu será usado como toolbar, ou seja, a barra de menu principal no toplevel.
.main add cascade -label Arquivo -underline 0 \ -menu .main.arquivo .main add cascade -label Edita -underline 0 \ -menu .main.editaNeste 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).
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. | ![]() |
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
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.
![]() |
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). |
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).