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 5
Criará 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.
 


Caixa de diálogo
Imprimir
no
sistema operacional Windows.

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 5
Criará a janela abaixo, com um botão no interior de uma moldura:

Agora execute:

.t.f1.b1 configure -activebackground white
.t.f1.b1 flash
Fará 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 x
Cria 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 x
Cria 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 y
Cria 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 0
Exibe 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 1
Exibe 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 y
Cria 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
info@souzamonteiro.com

Copyright(C) 2000 by Roberto Luiz Souza Monteiro