Tcl/Tk
Curso On-Line de Programação

Criando Menus

Tk suporta todos os tipos de menus existentes no UNIX e no Windows. Entretanto, para utilizar menus que combinam imagens e texto em uma mesma opção, será necessário utilizar o conjunto de mega-widgets Tix, que serão vistos na aula 22.

Veja um exemplo a seguir, adaptado do código fonte do meu browser TkShip:

toplevel .w1
   
wm protocol .w1 WM_DELETE_WINDOW {exit}
 
wm title .w1 "HTML Browser"
wm resizable .w1 1 1
# Centraliza a janela na tela
set x [expr {([winfo screenwidth .w1] - 640)/2}]
set y [expr {([winfo screenheight .w1] - 480)/2}]
#
# Cria os paineis
#
# Painel principal
frame .w1.fr0 -borderwidth 2 -relief raised
# Painel do menu
frame .w1.fr0.fr1 -borderwidth 2 -relief raised
# Painel da barra de ferramentas
frame .w1.fr0.fr2 -borderwidth 2 -relief raised
# Painel da barra de navegacao
frame .w1.fr0.fr3 -borderwidth 2 -relief raised
# Painel da janela do browser
frame .w1.fr0.fr4 -borderwidth 2
# Painel da barra de status
frame .w1.fr0.fr5 -borderwidth 2 -relief raised
#
# Cria os componentes dos paineis
#
# Cria os menus
menubutton .w1.fr0.fr1.file -text "Arquivo" -underline 0 -menu .w1.fr0.fr1.file.menu
menubutton .w1.fr0.fr1.edit -text "Editar" -underline 0 -menu .w1.fr0.fr1.edit.menu
menubutton .w1.fr0.fr1.options -text "Opcoes" -underline 0 -menu .w1.fr0.fr1.options.menu
menubutton .w1.fr0.fr1.help -text "Ajuda" -underline 1 -menu .w1.fr0.fr1.help.menu
# Menu Arquivo
menu .w1.fr0.fr1.file.menu
.w1.fr0.fr1.file.menu add command -label "Abrir" -accelerator "Ctrl+O" -command {bell}
.w1.fr0.fr1.file.menu add separator
.w1.fr0.fr1.file.menu add command -label "Sair" -accelerator "Ctrl+R" -command {exit}
# Menu Editar
menu .w1.fr0.fr1.edit.menu
.w1.fr0.fr1.edit.menu add command -label "Procurar" -accelerator "Ctrl+F" -command {bell}
# Menu Opcoes
menu .w1.fr0.fr1.options.menu
.w1.fr0.fr1.options.menu add cascade -label "Tamanho da fonte" -menu .w1.fr0.fr1.options.menu.font
.w1.fr0.fr1.options.menu add cascade -label "Nivel de indentacao" -menu .w1.fr0.fr1.options.menu.indent
# Menu Ajuda
menu .w1.fr0.fr1.help.menu
.w1.fr0.fr1.help.menu add command -label "Conteudo" -accelerator "F1" -command {bell}
.w1.fr0.fr1.help.menu add separator
.w1.fr0.fr1.help.menu add command -label "Sobre" -command {bell}
menu .w1.fr0.fr1.options.menu.font
.w1.fr0.fr1.options.menu.font add radiobutton -label "Pequena" -value 0 -variable Size -command {bell}
.w1.fr0.fr1.options.menu.font add radiobutton -label "Media" -value 4 -variable Size -command {bell}
.w1.fr0.fr1.options.menu.font add radiobutton -label "Grande" -value 12 -variable Size -command {bell}
menu .w1.fr0.fr1.options.menu.indent
.w1.fr0.fr1.options.menu.indent add radiobutton -label "Pequena" -value 0.6 -variable Indent -command {bell}
.w1.fr0.fr1.options.menu.indent add radiobutton -label "Media" -value 1.2 -variable Indent -command {bell}
.w1.fr0.fr1.options.menu.indent add radiobutton -label "Grande" -value 2.4 -variable Indent -command {bell}
#
# Instala os componentes
#
# Instala os paineis
pack .w1.fr0 -expand 1 -fill both
pack .w1.fr0.fr1 .w1.fr0.fr2 .w1.fr0.fr3 -fill x
pack .w1.fr0.fr4 -expand 1 -fill both
pack .w1.fr0.fr5 -fill x
    
# Instala os componentes da barra de menu
pack .w1.fr0.fr1.file .w1.fr0.fr1.edit .w1.fr0.fr1.options -side left
pack .w1.fr0.fr1.help -side right
# Redimensiona a janela
wm geometry .w1 640x480+$x+$y
O fragmento de código acima produzirá a janela abaixo:
 


Além dos menus comuns ao UNIX e o Windows, Tk também suporta um tipo de menu que somente existe no UNIX: os botões de menu.

De fato, os menus acima foram criados com o auxílio de quatro botões de menu, configurados para parecerem com uma barra de menu.

Botões de menu podem ser posicionados livremente sobre a janela, como na figura abaixo:

Botões de menu não devem ser confundidos com os comboboxes( as caixas de combinação do Windows ). Estas são providas por mega-widgets como Tix e BWidget.

Vejamos agora as principais opções disponíveis para os menubuttons:
 

Opção Descrição
-direction Direção para abrir o menu: above, below, left, right e flush.
-indicatoron Se 1, exibirá um pequeno indicador ao lado do rótulo do menu. Caso contrário, o indicador não será exibido.
-menu Caminho do menu que deve ser aberto quando o botão de menu for invocado.

Os menus suportam as seguintes opções, além daquelas suportadas pelos outros widgets:
 

Opção Descrição
-postcommand Comando Tcl para ser executado antes que o menu seja exibido.
-selectcolor Cor do indicador para checkbuttons e radiobuttons.
-tearoff Se 1, inclui uma linha pontilhada sobre as opções do menu, que quando clicada, solta o menu, criando uma janela movel para ele. Caso contrário, não inclui a linha pontilhada.
-tearoffcommand Comando para ser invocado quando o menu for destacado. O nome do menu e da janela criada serão passados ao comando.
-title Título da janela criada para o menu quando ele for destacado.
-type Tipo de menu: menubar, tearoff ou normal.

Os menus suportam os seguintes comandos:
 

Comando Descrição
activate Torna a entrada indicada, a entrada ativa.
add Adiciona um novo tipo de entrada ao menu. Os tipos de entradas suportados são: cascade, checkbutton, command, radiobutton e separator.
clone Cria um clone do menu, na forma nome_do_novo_menutipo_de_menu.
delete Remove todas as entradas do menu, na faixa indicada.
entrycget Retorna o valor de uma opção no menu.
entryconfigure Configura o valor de uma opção no menu.
index Retorna um índice numérico para o índice dado.
insert Insere um novo tipo de entrada no menu, na posição indicada. Os tipos de entradas suportados são: cascade, checkbutton, command, radiobutton e separator.
invoke Invoca a entrada indicada do menu.
post Exibe o menu nas coordenadas de tela indicadas.
postcascade Coloca o submenu associado com a entrada cascade( cascata ) na posição dada.
type Retorna o tipo de entrada na posição dada.
unpost Remove a janela de modo que ela não seja mais exibida.
yposition Retorna a coordenada Y da entrada especificada no menu.

As entradas dos menus suportam as seguintes opções:
 

Opção Descrição
-accelerator Uma string para ser exibida ao lado do texto da entrada do menu.
-command Comando a ser executado quando o menu for invocado.
-columnbreak Se 1, a entrada aparecerá no topo de uma nova coluna no menu.
-hidemargin Se 1, as margens padrão não serão exibidas ao redor no ítem do menu.
-indicatoron Se 1, exibirá um pequeno indicador ao lado do rótulo da entrada do menu. Caso contrário, o indicador não será exibido. Usado com checkbuttons e radiobuttons.
-label Rótulo da entrada do menu.
-menu Nome de caminho do menu cascade onde a entrada deve ser exibida..
-offvalue Valor que deve ser atribuído à variável associada ao checkbutton quando ele não estiver selecionado.
-onvalue Valor que deve ser atribuído à variável associada ao checkbutton quando ele estiver selecionado.
-selectcolor Cor do indicador em um checkbutton ou radiobutton.
-selectimage Imagem para ser exibida no indicador de um checkbutton ou radiobutton.
-value Valor que deve ser atribuído à variável associada ao radiobutton quando ele estiver selecionado.
-variable Nome de uma variável global que conterá o valor de um checkbutton ou radiobutton.

Os menus suportam os seguintes índices: número, active, last, none, @Y, string para procura.
 

Criando menus suspensos

Para criar um menu suspenso, daqueles que surgem quando se clica com o botão direito do mouse sobre uma janela, usamos o comando tk_popup:

tk_popup menu x y [entrada]
Onde menu é o nome( caminho ) do menu que se deseja exibir, x e y são as coordenadas onde o menu deve ser exibido, e entrada é a entrada do menu que deve ser exibida nas coordenadas especificadas.

Veja o exemplo seguinte, baseado no fragmento de código apresentado no início da aula:

tk_popup .w1.fr0.fr1.help.menu 300 300
O menu Ajuda será exibido nas coordenadas 300,300 da tela.

Os eventos( binds ) serão estudados na próxima aula.

Para uma descrição detalhada de todos os comandos disponíveis em Tk, consulte a documentação on-line, ou o Tcl/Tk Reference Guide, ou ainda o Tcl/Tk Electronic Reference.

Para maiores informações envie e-mail para info@souzamonteiro.com.


http://www.souzamonteiro.com
info@souzamonteiro.com

Copyright(C) 2000 by Roberto Luiz Souza Monteiro