![]() |
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:
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.35O 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 |
Copyright(C) 2000 by Roberto Luiz Souza Monteiro