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

O widget text

O widget text oferece uma área para renderização de hyper-texto, que pode ser desde texto baseado nas tags Tk até SGML, HTML e XML. Para renderização de texto HTML pode-se usar a biblioteca HTML Library 0.3, já para trabalhar com XML ou SGML é preciso utilizar o parser TclXML 1.2 e implementar as rotinas para renderizar o documento. A biblioteca HTML Library 0.3 suporta apenas HTML 2.0. Pode ser uma boa ocasião para começar-mos a pensar em implementar um motor para HTML 4, usando TclXML.

Veja como o widget text é poderoso:


Browser TkShip implementado
utilizando o widget text

A imagem acima mostra o browser TkShip que eu implementei utilizando o widget text e a biblioteca HTML Library 0.3. Fiz algumas modificações na biblioteca, mas foi apenas para melhorar o aspecto da pagina.

Você pode obter o mesmo efeito, inserindo texto no widget e configurando tags Tk para cada parte do documento, mas isso, em geral, não vale a pena. É melhor usar HTML.

Veja um exemplo:

toplevel .t
text .t.text
pack .t.text -expand 1 -fill both
.t.text tag configure AZUL -foreground blue
.t.text tag configure VERMELHO -foreground red
.t.text insert end "Esta é uma linha em texto NORMAL.\n"
.t.text insert end "Esta é uma linha em texto AZUL.\n"
.t.text insert end "Esta é uma linha em texto VERMELHO.\n"
.t.text tag add AZUL 2.0 2.31
.t.text tag add VERMELHO 3.0 3.35
O código acima desenha uma janela com um widget text em seu interior:

Vejamos agora cada uma das opções suportadas pelo widget text:
 

Opção Descrição
-spacing1 Espaço acima do parágrafo. Utiliza unidades de tela.
-spacing2 Espaço entre parágrafos. Utiliza unidades de tela.
-spacing3 Espaço abaixo do parágrafo. Utiliza unidades de tela.
-tabs Lista de Tabulação, dadas como distâncias em unidades de tela. Cada Tabulação pode ser seguida de um dos modificadores: left, right, center ou numeric.
-wrap Especifica a quebra de linha. Pode ser: none, char ou word.

Os comandos suportados pelo widget text são:
 

Comando Descrição
bbox Retorna uma lista com as coordenadas de um retângulo em volta do caractere indicado, na forma: {x y largura altura}.
compare Compara os índices de acordo com o operador relacional indicado, na forma: índice1 operador indice2.
delete Apaga a faixa de caracteres indicada.
dlineinfo Retorna uma lista na fora {x y largura altura linha_de_base} descrevendo a área na tela ocupada pela linha indicada.
dump Retorna informações detalhadas sobre o texto na faixa dada. Suporta as chaves: -all, -mark, -tag, -text e -window, para especificar o tipo de informação desejada. É possível especificar a chave -command para executar um comando para cada tipo de elemento dentro da faixa dada.
get Retorna a string de caracteres na faixa indicada.
image cget Retorna o valor de uma opção na imagem indicaca pelo índice dado.
image configure Configura o valor de uma opção na imagem indicaca pelo índice dado.
image create Cria uma imagem na posição indicada pelo índice dado.
image names Retorna os nomes de todas as imagens no widget.
index Retorna a posição do índice na forma linha.coluna.
insert Insere texto no widget, aplicando as tags indicadas.
mark gravity Retorna ou configura o caractere adjacente à marca dada. Pode ser configurado para left ou right.
mark names Rerorna os nomes de todas as marcas configuradas, em uma lista.
mark next | previous Retorna o nome da próxima/anterior marca após/antes do índice.
mark set Aplica a marca indicada no índice dado.
mark unset Remove cada marca indicada.
scan Veja os comandos de scroll na aula 29.
search Retorna o índice do primeiro caractere correspondente à expressão especificada na faixa de texto indicada. Suporta as seguintes chaves: -forward, -backward, -exact, -regexp, -countvariável, -nocase.
see Ajusta a janela para que o caractere apontado pelo índice dado, seja visível.
tag add Aplica uma tag aos caracteres na faixa dada.
tag bind Configura um evento para uma tag dada.
tag cget Retorna o valor de uma opção para a tag dada.
tag configure Configura o valor de uma opção para a tag dada.
tag delete Apaga as informações existentes na tag dada.
tag lower Muda a prioridade da tag dada para que ela fique abaixo da outra tag dada.
tag names Retorna uma lista com os nomes de todas as tags associadas com o caractere sob o índice dado.
tag nextrange Procura nos caracteres na faixa dada pela primeira região coberta pela tag dada. Retorna a faixa de caracteres da região encontrada.
tag prevrange Executa a mesma função do comando nextrange, mas procura de traz para a frente..
tag raise Muda a prioridade da tag dada para que ela fique acima da outra tag dada.
tag ranges Retorna todas as faixas de caracteres cobertos pela tag dada.
tag remove Remove a tag dada da faixa de caracteres dada.
window cget Retorna o valor da opção dada da janela embutida dada.
window configure Configura o valor da opção dada da janela embutida dada.
window create Cria uma janela embutida no índice dado.
window names Retorna os nomes de todas as janelas embutidas no widget text.
xview Rola a janela horizontalmente.
yview Rola a janela verticalmente.

O widget text suporta os seguintes índices, na forma base modificador:

Base: linha.coluna, @X,Y, end, marca, tag.first, tag.last, caminho_para_a_janela_embutida, nome_da_imagem.

Modificador: + ou -contadorchars, + ou - contador lines, linestart, lineend, wordstart, wordend.

As tags suportam as seguintes opções, além daquelas suportadas pelo widget text:
 

Opção Descrição
-bgstipple Um bitmap padrão para o fundo.
-fgstipple Um bitmap padrão para o frente.
-lmargin1 Margem esquerda da primeira linha do parágrafo.
-lmargin2 Margem esquerda do corpo do parágrafo.
-offset Deslocamento da linha de base, em relação à linha de base normal.
-overstrike Se 1, o texto será riscado. Caso contrário, o texto não será riscado.
-rmargin Margem direita para todas as linhas sob esta tag.
-tabs Tabulações na forma de uma lista: {tab1 tab2 tab3... tabN}.
-underline Se 1, o texto será sublinhado. Caso contrário, o texto não será sublinhado.

As janelas embutidas suportam as seguintes opções:
 

Opção Descrição
-align Alinhamento vertical da janela, em relação à linha onde está inserida: top, center, bottom, baseline.
-create Executa o script indicado, que deve retornar o nome_de_caminho da janela. Deve ser utilizado, caso a opção -window não seja fornecida.
-padx Espaço entre as laterais esquerda e direita da janela e os outros ítens no widget text. Em unidades de tela.
-pady Espaço entre as laterais superior e inferior da janela e os outros ítens no widget text. Em unidades de tela.
-stretch Se 1, a janela se esticará verticalmente para preencher a linha. Caso contrário, a janela não se esticará.
-window Nome da janela.

As imagens embutidas suportam as seguintes opções:
 

Opção Descrição
-align Alinhamento vertical da imagem, em relação à linha onde está inserida: top, center, bottom, baseline.
-image Uma imagem criada com o comando image.
-nome Nome da imagem.
-padx Espaço entre as laterais esquerda e direita da janela e o outros ítens no widget text. Em unidades de tela.
-pady Espaço entre as laterais superior e inferior da janela e o outros ítens no widget text. Em unidades de tela.

Exemplos

O exemplo a seguir foi adaptado do material que acompanha o Kit de instalação do Tcl/Tk 8.3.1:
 

#
# Este script cria um widget text que ilustra os vários tipos de estilos que podem
# ser configurados para as tags
#
# Desenha a janela
set w .style
catch {destroy $w}
toplevel $w
wm title $w "Demonstração do widget Text - Estilos"
wm iconname $w "style"
frame $w.buttons
pack $w.buttons -side bottom -fill x -pady 2m
button $w.buttons.dismiss -text Fechar -command "destroy $w"
pack $w.buttons.dismiss -side left -expand 1
text $w.text -yscrollcommand "$w.scroll set" -setgrid true -width 70 -height 32 -wrap word
scrollbar $w.scroll -command "$w.text yview"
pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both
# Configura os estilos
$w.text tag configure bold -font {Courier 12 bold italic}
$w.text tag configure big -font {Courier 14 bold}
$w.text tag configure verybig -font {Helvetica 24 bold}
if {[winfo depth $w] > 1} {
    $w.text tag configure color1 -background #a0b7ce
    $w.text tag configure color2 -foreground red
    $w.text tag configure raised -relief raised -borderwidth 1
    $w.text tag configure sunken -relief sunken -borderwidth 1
} else {
    $w.text tag configure color1 -background black -foreground white
    $w.text tag configure color2 -background black -foreground white
    $w.text tag configure raised -background white -relief raised -borderwidth 1
    $w.text tag configure sunken -background white -relief sunken -borderwidth 1
}
$w.text tag configure bgstipple -background black -borderwidth 0 -bgstipple gray12
$w.text tag configure fgstipple -fgstipple gray50
$w.text tag configure underline -underline on
$w.text tag configure overstrike -overstrike on
$w.text tag configure right -justify right
$w.text tag configure center -justify center
$w.text tag configure super -offset 4p -font {Courier 10}
$w.text tag configure sub -offset -2p -font {Courier 10}
$w.text tag configure margins -lmargin1 12m -lmargin2 6m -rmargin 10m
$w.text tag configure spacing -spacing1 10p -spacing2 2p -lmargin1 12m -lmargin2 6m -rmargin 10m
# Insere o texto
$w.text insert end {Widgets Text como este permitem a você exibir informações em uma variedade de estilos.
A exibição de estilos é controlada por um mecanismo chamado }
$w.text insert end tags bold
$w.text insert end {. Tags são apenas nomes que você pode aplicar a um ou mais caracteres em um widget text.
Você pode configurar tags com vários estilos.
Se você fizer isso, os caracteres rotulados serão exibidos com o estilo que você escolher.
Os estilos disponíveis são:}
$w.text insert end "\n1. Fonte." big
$w.text insert end "Você pode escolher qualquer fonte X, "
$w.text insert end grande verybig
$w.text insert end " ou "
$w.text insert end "pequena.\n"
$w.text insert end "\n2. Cor." big
$w.text insert end "Você pode determinar tanto a "
$w.text insert end "cor de fundo" color1
$w.text insert end " como "
$w.text insert end "a cor de primeiro plano" color2
$w.text insert end "\n, ou "
$w.text insert end ambas {color1 color2}
$w.text insert end ".\n"
$w.text insert end "\n3. Padrão." big
$w.text insert end "Você pode modificar tando o "
$w.text insert end fundo bgstipple
$w.text insert end " como o "
$w.text insert end "primeiro plano." fgstipple
$w.text insert end {Fazendo com que as informações sejam desenhadas utilizando um bitmap, ao invés de uma cor sólida.}
$w.text insert end "\n4. Sublinhado." big
$w.text insert end "Você pode "
$w.text insert end sublinhar underline
$w.text insert end " faixas de texto.\n"
$w.text insert end "\n5. Riscado." big
$w.text insert end "Você pode "
$w.text insert end riscar overstrike
$w.text insert end " faixas de texto.\n"
$w.text insert end "\n6. Efeitos 3-D." big
$w.text insert end {Você pode modificar o fundo, para que ele seja desenhado com bordas que farão os caracteres parecerem estar }
$w.text insert end "em alto relevo" raised
$w.text insert end " ou "
$w.text insert end "em baixo relevo" sunken
$w.text insert end ".\n"
$w.text insert end "\n7. Alinhamento." big
$w.text insert end "Você pode fazer com que as linhas sejam\n"
$w.text insert end "alinhadas pela esquerda,\n"
$w.text insert end "alinhadas pela direita, ou\n" right
$w.text insert end "centralizadas.\n" center
$w.text insert end "\n8. Sobre-escrido e sub-escrito."  big
$w.text insert end "Você pode controlar a "
$w.text insert end "posição vertical do texto para criar sobre-escritos como 10"
$w.text insert end "n" super
$w.text insert end " ou sub-escritos como X"
$w.text insert end "i" sub
$w.text insert end ".\n"
$w.text insert end "\n9. Margens." big
$w.text insert end "Você pode controlar o espaçamento lateral"
$w.text insert end " em\ncada lado do texto:\n"
$w.text insert end "Este parágrafo é um exemplo de uso de " margins
$w.text insert end "margens. Ele consiste de uma simples linha de texto " margins
$w.text insert end "quebrada na tela. Existem duas especificações " margins
$w.text insert end "para margens à esquerda, uma para a primeira linha " margins
$w.text insert end "exibida, associada com a linha de texto, " margins
$w.text insert end "e uma para as linha subsequentes,  " margins
$w.text insert end "que serão quebradas caso necessário. Há também uma " margins
$w.text insert end "especificação separada para a margem direita, " margins
$w.text insert end "a qual é usada para determinar o ponto para a quebra de linha.\n" margins
$w.text insert end "\n10. Espaçamento." big
$w.text insert end "Você pode controlar o espaço entre linhas com três\n"
$w.text insert end "parâmetros separados. \"Spacing1\" determina "
$w.text insert end "o espaço extra deixado\nsobre uma linha, \"spacing3\" "
$w.text insert end "determina o espaço extra deixado abaixo de uma linha,\ne "
$w.text insert end "e se a linha de texto será quebrada, \"spacing2\" determina o "
$w.text insert end "espaço extra deixado\nentre as linhas "
$w.text insert end "que compõem o texto.\n"
$w.text insert end "Este parágrafo endentado, ilustra como o espaçamento " spacing
$w.text insert end "pode ser usado. Cada parágrafo, é uma " spacing
$w.text insert end "única linha no widget text, o qual sofre " spacing
$w.text insert end "uma quebra de linha gerada pelo widget.\n" spacing
$w.text insert end "Spacing1 está configurado para 10 pontos neste texto, " spacing
$w.text insert end "o que resulta em saltos relativamente grandes entre " spacing
$w.text insert end "os parágrafos. Spacing2 está configurado para 2 pontos, " spacing
$w.text insert end "oque resulta em apenas um pequeno espaçamento " spacing
$w.text insert end "no parágrafo. Spacing3 não está sendo usado " spacing
$w.text insert end "neste exemplo.\n" spacing
$w.text insert end "Para ver como o espaçamento funciona, selecione uma faixa de texto " spacing
$w.text insert end "neste parágrafo. A seleção " spacing
$w.text insert end "cobrirá o espaçamento adicional." spacing


É isso. Copie e cole o fragmento de código acima na linha de comando do wish. Você obterá a janela abaixo:

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