![]() |
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+$yO 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 300O 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 |
Copyright(C) 2000 by Roberto Luiz Souza Monteiro