![]() |
Tcl/Tk
Curso On-Line de Programação |
Visão geral dos widgets
Widgets são compondentes gráficos como botões, caixas de texto, imagens e menus, utilizados para permitir que o usuário interaja com o programa.
Tk suporta diversos widgets básicos, comuns a vários sistemas operacionais e pode ser extendido através da criação de mega-widgets( widgets compostos de outros widgets ), que serão estudados na aula 22.
Os widgets Tk, em geral, possuem mais recursos e são mais rápidos que os widgets disponibilizados pelo sistema operacional. Entretanto, a Scriptics, atualmente Ajuba Solutions, tornou alguns widgets nativos. O que fez com que algumas opções desaparecessem em algumas plataformas. Um exemplo disso é o widget scrollbar, que no windows não puporta as opções relativas às cores dos sliders.
Existem diferenças de performance de um sistema operacional para outro. Por exemplo: no Linux os widgets são várias vezes mais rápidos que no Windows. Entretanto, Trabalhando com mega-widgets esta relação pode se inverter. É o caso dos mega-widgets BWidget, que no Windows são ligeiramente mais rápidos que no Linux. Isso considerando que os testes foram realizados na mesma máquina e sob as mesmas cirtunstâncias.
A seguir são apresentados os widgets
básicos de Tk 8.3.
toplevel
Os toplevels, ou janelas, foram discutidos na aula anterior. Assim, para maiores detalhes, veja a aula 10.
Atualmente, Tk não suporta formulários MDI, que são interfaces de usuário compostas de múltiplos documentos. Na prática, isso significa que uma janela funciona como um gerenciador de janelas para outras janelas embutidas. Se você prestou atenção na aula anterior, deve ter verificado, que é possível embutir uma janela em outra, usando a opçào -use de Tk. Contudo, isso não criará uma janela com moldura e botões de controle dentro da janela mãe. apenas colocará a janela dentro da outra. Formulários MDI são gerenciadores de janelas completos, com opções de maximizar, minimizar etc.
Embora Tk não tenha o suporte MDI embutido, você pode obter esta funcionalidade através da biblioteca Mysunds_MDI. Veja um exemplo de um programa escrito em Tcl/Tk, usando a biblioteca Mysunds_MDI:

Observe que apesar da incrível semelhança com os formulários MDI do Windows, trata-se de uma biblioteca escrita em 100% puro Tcl. Na prática, você terá que editar o arquivo para poder utilizá-la no Linux, pois o autor utilizou nomes de cursores de mouse que só existem no Windows. Mas basta uma pequena alteração, em uma única função e tudo funcionará bem. Veja a documentação incluída no pacote da biblioteca para entender melhor o que precisa ser feito.
Você pode fazer o download da biblioteca
Mysunds_MDI através do site: http://www.souzamonteiro.com/download_freeware.shtml.
message
As messages são widgets parecidos
com labels e estão em desuso, pois os labels os substituíram
totalmente.
frames
Frames são molduras, onde os widgets podem ser agrupados. Frames são muito usados para tornar as janelas dos programas mais elegantes e organizadas.
As opções mais importantes
suportadas pelos frames são:
| Opção | Descrição |
| -borderwidth | Largura da borda. |
| -relief | Tipo de relevo 3D: flat, groove, raised, ridge, sunken. |
Veja um exemplo:
toplevel .t
frame .t.f1 -relief ridge -borderwidth 2
button .t.f1.b1 -text "OK" -command {exit}
pack .t.f1 -padx 5 -pady 5
pack .t.f1.b1 -padx 5 -pady 5Criará a janela abaixo, com um botão no interior de uma moldura:

canvas
Os canvas são os widgets mais importantes, pois permitem que os programas em Tcl/Tk imprimam documentos PostScript de alta qualidade.
Canvas são áreas para desenho, com suporte a uma grande variedade de objetos vetoriais. De fato, você poderá fazer de tudo com um canvas, até mesmo criar mega-widgets como é o caso da biblioteca Mysunds_MDI e dos megawidgets BWidget.
Um bom exemplo do uso dos canvas para impressão é a biblioteca TkPrinter. Veja algumas telas do programa de demonstração da biblioteca TkPrinter e das caixas de diálogo Visualizar Impressão, Imprimir e Configurar Impressora, no Linux e no Windows:
Caixa de diálogo
Visualizar Impressão
no
sistema operacional Linux.
Caixa de diálogo
Imprimir
no
sistema operacional Linux.
Caixa de diálogo
Configurar Impressora
no
sistema operacional Linux.
A biblioteca TkPrinter faz parte do meu conjunto de mega-widgets e você pode fazer o download dela através do meu site: http://www.souzamonteiro.com/download_freeware.shtml. Procure o arquivo widgets-1_0_0.tgz.
Para Linux TkPrinter foi escrito em 100% puro Tcl. Para Windows TkPrinter utiliza uma DLL( tkprint80.dll, tkprint81.dll ou tkprint82.dll ), incluída na distribuição. O código fonte das DLLs também está disponível em meu site sob o nome de tkprint. As DLLs não foram desenvolvidas por mim, eu desenvolvi apenas o código em Tcl/Tk.
TkPrinter é sensível ao sistema operacional, e selecionará, automaticamente, as bibliotecas necessárias, sem que seu programa precise ser modificado para funcionar no Linux e no Windows.
Os canvas serão estudados em detalhes
na próxima aula.
button
Buttons são botões que podem ser clicados com o mouse. Nós os temos utilizado em todos os nossos exemplos até aqui.
Botões suportam texto e imagens. Mas só texto ou imagem de cada vez, nunca os dois ao mesmo tempo.
As opções mais importantes
disponíveis para os botões são:
| Opção | Descrição |
| -command | Comando Tcl para ser executado quando o botão for pressionado. |
| -image | Imagem para ser exibida no botão. |
| -text | Texto para ser exibido no botão. |
| -underline | Índice do caractere que deve ser sublinhado para indicar a tecla de atalho. |
Os comando suportados pelos botões
são:
| Comando | Descrição |
| flash | Faz o botão piscar, alternando as cores normais e as cores active. |
| invoke | Executa o script -command de um botão. |
Veja um exemplo:
toplevel .t
frame .t.f1 -relief ridge -borderwidth 2
button .t.f1.b1 -text "OK" -command {exit}
pack .t.f1 -padx 5 -pady 5
pack .t.f1.b1 -padx 5 -pady 5Criará a janela abaixo, com um botão no interior de uma moldura:

Agora execute:
.t.f1.b1 configure -activebackground white
.t.f1.b1 flashFará o botão piscar.
entry
Entries são caixas de texto para digitação. São muito usadas com bancos de dados e programas que requerem algum tipo de digitação de dados pelo usuário.
Os widgets entry podem ser configurados para verificar a validade dos dados digitados e formatá-los ao final da digitação. Com Tcl/Tk menor que 8.3, utilizamos binds para verificar a validade dos dados. Com Tcl/Tk maior ou igual a 8.3 podemos utilizar as opções especificas de validação disponíveis. Neste curso estudaremos apenas a validação através de binds, pois as opções de Tk 8.3 apenas configuram os binds para nós, e além disso, muitas distribuições do Linux vem com Tcl/Tk 8.0.4, que só permite validação através de binds.
As validações serão estudadas na aula 16 que trata de eventos em Tk.
As principais opções disponíveis
para os widgets entry são:
| Opção | Descrição |
| -justify | Determina o alinhamento do texto: left, center, right. |
| -state | Estado: normal, disabled. |
| -show | Caractere para ser exibido quando o usuário estiver digitando uma senha. |
| -textvariable | Variável usada para data-bind. |
Os principais comando disponíveis
para os widget entry são:
| Comando | Descrição |
| bbox | Retorna as coordenadas X1 Y1 X2 Y2 do caractere indicado. |
| delete | Apaga a faixa de caracteres indicados. |
| get | Retorna a string apresentada no widget entry. |
| icursor | Exibe o cursor antes do caractere indicado. |
| index | Retorna o índice numérico correspondente ao índice dado. |
| insert | Insere a string dada na posição indicada. |
| scan | Veja os comandos de scroll na aula 29. |
| selection adjust | Ajusta o final da seleção para o índice fornecido. |
| selection clear | Remove a seleção. |
| selection from | Ajusta o ponto âncora para a seleção. |
| selection present | Retorna 1 se algum caractere estiver selecionado. Caso contrário, 0. |
| selection range | Seleciona a faixa de caracteres indicados. |
| selection to | Ajusta o final da seleção. |
O widget entry suporta os seguintes índices
para os caracteres: número, anchor, end, insert,
sel.first,
sel.last,
@coordenadaX.
Exemplos:
toplevel .t
entry .t.e -textvariable entrada
label .t.lbl -textvariable entrada -anchor sw -justify left
pack .t.e
pack .t.lbl -expand 1 -fill xCria uma janela com uma caixa para digitação e um rótulo onde é exibido todo texto digitado pelo usuário.

label
Labels são rótulos onde podemos
exibir texto ou imagem. São widgets muito simples e suas opções
são as opções gerais apresentadas na aula 09.
Exemplos:
toplevel .t
entry .t.e -textvariable entrada
label .t.lbl -textvariable entrada -anchor sw -justify left
pack .t.e
pack .t.lbl -expand 1 -fill xCria uma janela com uma caixa para digitação e um rótulo onde é exibido todo texto digitado pelo usuário.

text
O widget text é um componente extremamente sofisticado, que suporta texto, imagens, hyper-texto e também outras janelas e widgets embutidos.
Com o auxílio da biblioteca HTML
Library é possível renderizar HTML 2.0 e algumas tags do
HTML 3.0. A biblioteca HTML Library foi escrita em 100% puro Tcl pelos
engenheiros da Sun Microsystem e é realmente excelente. Eu a utilizo
com uma pequena modificação em meu browser HTML TkShip:
Browser HTML TkShip
sendo executado
no
sistema operacional Linux
TkShip foi inteiramente escrito em Tcl/Tk e faz parte do meu conjunto de mega-widgets, podendo ser executado como um aplicativo ou como uma biblioteca de ajuda( help ). Você pode fazer o download do browser TkShip através do meu site: http://www.souzamonteiro.com/download_freeware.shtml. Procure o arquivo widgets-1_0_0.tgz.
O widget text será estudado em detalhes
na aula 14.
listbox
Listboxes são caixas de listagem, onde são exibidas listas de ítens que podem ser selecionados pelo usuário.
Atualmente as listboxes suportam apenas uma coluna, mas você pode utilizar o mega-widget mclistbox, para exibir tabelas bastante sofisticadas.

Você pode fazer o download do mega-widget mclistbox através do meu site: http://www.souzamonteiro.com/download_freeware.shtml.
As principais opções suportadas
pelo widget listbox são:
| Opção | Descrição |
| -xscrollcommand | Comando usado para conectar a scrollbar horizontal. |
| -yscrollcommand | Comando usado para conectar a scrollbar vertical. |
| -selectMode | Modo de seleção: single, browse, multiple, extended. |
Os comando suportados pelos listboxes são:
| Comando | Descrição |
| activate | Ajusta o elemento ativo para o índice especificado. |
| bbox | Retorna uma lista {x y largura altura} com as coordenadas do retângulo ao redor do elemento indicado. |
| curselection | Retorna uma lista com os elementos selecionados. |
| delete | Remove a faixa de elementos da listbox. |
| get | Retorna uma lista contendo os elementos na faixa indicada. |
| index | Retorna um número correspondente ao índice especificado. |
| insert | Insere um elemento na posição especificada. |
| nearest | Retorna o índice do elemento próximo à coordenada especificada. |
| scan | Veja os comandos de scroll na aula 29. |
| selection anchor | Ajusta a âncora da seleção para o elemento especificado. |
| selection clear | Remove a seleção na faixa especificada.. |
| selection includes | Retorna 1 se o elemento estiver selecionado. Caso contrário, 0. |
| selection set | Adiciona todos os elementos na faixa especificada à seleção. |
| see | Rola a tela para que o elemento especificado se torne visível. |
| size | Retorna o número de elementos na listbox. |
| xview | Rola a janela horizontalmente. |
| yview | Rola a janela verticalmente. |
O widget listbox suporta os seguintes índices:
número(
começa com 0 ), active, anchor,
end, @X,Y.
Exemplo:
toplevel .t
listbox .t.list -selectmode multiple -yscrollcommand {.t.vscr set}
scrollbar .t.vscr -orient vertical -command {.t.list yview}
pack .t.list -side left
pack .t.vscr -side left -expand 1 -fill yCria uma janela com uma listbox e uma scrollbar.
for {set i 0} {$i <= 20} {incr i} {
.t.list insert end "Linha $i"
}Preenche a listbox com 21 ítens.
bind .t.list <ButtonRelease> {
bell
puts "Você selecionou os ítens: [.t.list curselection]"
}Configura a listbox para soar um beep e exibir os ítens selecionados, sempre que o usuário liberar o botão do mouse sobre a listbox.

menu, menubutton
Tk suporta menus bastante sofisticados
sendo que seu estudo merece uma aula a parte. Assim esturaremos os menus
e botões de menu na aula 15.
checkbutton
Checkbuttons são pequenos botões que podem ser selecionados pelo usuário. Mas fácil que falar de um botão de checagem é mostrá-lo:
toplevel .t
checkbutton .t.chk1 -text "Opção 1" -variable chkopcao1 -onvalue 1
checkbutton .t.chk2 -text "Opção 2" -variable chkopcao2 -onvalue 1
pack .t.chk1 .t.chk2
set chkopcao1 1
set chkopcao2 0Exibe uma janela com dois botões de checagem, estando o primeiro botão selecionado.

Checkbuttons podem ser conectados a bancos de dados através da opção -variable, que especifica uma variável para coneção.
As principais opções suportadas
pelos widgets checkbutton são:
| Opção | Descrição |
| -command | Comando a ser executado quando o checkbutton for clicado. |
| -indicatoron | Especifica se o indicador de seleção deve ser exibido ou não. Se 1 exibe um indicador. Caso contrário, não exibe o indicador. |
| -offvalue | Valor que a variável indicada por -variable deve apresentar para que o checkbutton não esteja selecionado. |
| -onvalue | Valor que a variável indicada por -variable deve apresentar para que o checkbutton esteja selecionado. |
| -selectcolor | Cor a ser usada no indicador quando ele estiver selecionado. |
| -selectimage | Imágem a ser exibida no indicador quando ele estiver selecionado. |
| -variable | Variável conectada ao checkbutton. |
Os principais comandos suportados pelo
widget checkbutton são:
| Comando | Descrição |
| deselect | Remove a seleção do checkbutton. |
| flash | Faz o checkbutton piscar, alternando as cores normais e as cores active. |
| invoke | Executa o script -command do checkbutton. |
| select | Seleciona o checkbutton. |
| toggle | Troca o estado atual do checkbutton. |
radiobutton
Radiobuttons são semelhantes a checkbuttons mas são mutuamente exclusivos. Somente um botão de rádio pode estar selecionado em um grupo de botões. Mas fácil que falar de um botão de rádio é mostrá-lo:
toplevel .t
radiobutton .t.rad1 -text "Opção 1" -variable opcao -value 1
radiobutton .t.rad2 -text "Opção 2" -variable opcao -value 0
pack .t.rad1 .t.rad2
set opcao 1Exibe uma janela com dois botões de rádio, estando o primeiro botão selecionado.

Radiobuttons podem ser conectados a bancos de dados através da opção -variable, que especifica uma variável para coneção.
As principais opções suportadas
pelos widgets radiobutton são:
| Opção | Descrição |
| -command | Comando a ser executado quando o radiobutton for clicado. |
| -indicatoron | Especifica se o indicador de seleção deve ser exibido ou não. Se 1 exibe um indicador. Caso contrário, não exibe o indicador. |
| -selectcolor | Cor a ser usada no indicador quando ele estiver selecionado. |
| -selectimage | Imágem a ser exibida no indicador quando ele estiver selecionado. |
| -value | Valor que a variável indicada por -variable deve apresentar para que o radiobutton esteja selecionado. |
| -variable | Variável conectada ao radiobutton. |
Os principais comandos suportados pelo
widget radiobutton são:
| Comando | Descrição |
| deselect | Remove a seleção do radiobutton. |
| flash | Faz o radiobutton piscar, alternando as cores normais e as cores active. |
| invoke | Executa o script -command do radiobutton. |
| select | Seleciona o radiobutton. |
scrollbar
Scrollbars são controles que permitem rolar, horizontal ou verticalmente, o conteúdo de outro widget.
O exemplo a seguir mostra uma janela com um widget listbox e uma scrollbar vertical conectada a ele:
toplevel .t
listbox .t.list -selectmode multiple -yscrollcommand {.t.vscr set}
scrollbar .t.vscr -orient vertical -command {.t.list yview}
pack .t.list -side left
pack .t.vscr -side left -expand 1 -fill yCria uma janela com uma listbox e uma scrollbar.
for {set i 0} {$i <= 20} {incr i} {
.t.list insert end "Linha $i"
}Preenche a listbox com 21 ítens.
bind .t.list <ButtonRelease> {
bell
puts "Você selecionou os ítens: [.t.list curselection]"
}Configura a listbox para soar um beep e exibir os ítens selecionados, sempre que o usuário liberar o botão do mouse sobre a listbox.

As scrollbars não têm vida isolada e só fazem sentido quando conectadas a algum widget.
As scrollbars suportam as seguintes opções:
| Opção | Descrição |
| -activerelief | Relevo usado no elemento ativo. |
| -command | Comando a ser executado quando o slider for movimentado. |
| -elementborderwidth | Largura usada nas bordas dos elementos internos.. |
| -width | A dimensão mais estreita da scrollbar. |
Os principais comandos suportados pelo
widget scrollbar são:
| Comando | Descrição |
| activate | Exibe o elemento com os atributos de ativo. Elementos podem ser: arrow1, trough1, slider, trough2 ou arrow2. |
| delta | Retorna uma fração da posição do slider para um movimento deltaX deltaY. |
| fraction | Retorna um número entre 0 e 1 representando o ponto X Y na área de deslizamento da scrollbar. |
| get | Retorna os ajustes da scrollbar como uma lista contendo: {primeiro último}. |
| identify | Retorna o nome do elemento nas coordenadas X Y. |
| set | Move o slider para a posição representada pela porcentagem primeiro último na área de deslizamento do slider. |
scale
Scales são escalas deslizantes. São muito úteis para criar controles como os de tonalidade para scanners. Veja a GUI para o scanner paralelo Primax, escrita em 100% puro Tcl e disponível em http://www.souzamonteiro.com/download_freeware.shtml.
Veja o exemplo:
global texto
toplevel .t
scale .t.scl -orient horizontal -from 0 -to 100 -resolution 1 -variable valor -command escala:moveu
label .t.lbl -textvariable texto -anchor sw -justify left
pack .t.scl -side top -expand 1 -fill x
pack .t.lbl -side top -expand 1 -fill x
set valor 0
proc escala:moveu {posicao} {
global texto
set texto "Você ajustou a escala para $posicao"
}O exemplo criará uma janela com uma escala e um rótulo:

As scales suportam as seguintes opções:
| Opção | Descrição |
| -bigincrement | Valor a ser usado para um grande incremento da escala. |
| -command | Comando a ser executado quando o valor da escala for alterado. Deve ser o nome de um comando que receba como argumento o valor da escala. |
| -digits | Número de algarismos significativos que devem ser retidos. |
| -from | Menor valor da escala. |
| -label | Rótulo a ser exibido sob a escala. |
| -length | Largura ou altura da escala. |
| -resolution | Valor do incremento. |
| -showvalue | Se 1, exibe o valor da escala no rótulo. Se 0, não exibe o valor da escala. |
| -sliderlength | Largura ou altura do slider. |
| -sliderrelief | Relevo do slider. |
| -tickinterval | Intervalo entre os ticks da escala. |
| -to | Maior valor da escala. |
| -variable | Variável que conterá ou ajustará o valor da escala. |
| -width | Largura do elemento mais estreito da escala. |
Os principais comandos suportados pelo
widget scale são:
| Comando | Descrição |
| coords | Retorna as coordenadas X e Y correspondentes ao valor especificado. |
| get | Retorna o valor atual da escala, ou caso sejam fornecidos os valores X Y, retorna o valor sob as coordenadas especificadas. |
| identify | Retorna o nome da parte da escala sob as coordenadas especificadas: slider, trough1 ou trough2. |
| set | Muda o valor da escala. |
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