Guia de Consulta Rรกpida
Tcl/Tk Roberto L. S. Monteiro
Novatec Editora www.novateceditora.com.br
Guia de Consulta Rápida Tcl/Tk de Roberto L. S. Monteiro
Copyright2001 da Novatec Editora Ltda.
Todos os direitos reservados. É proibida a reprodução desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora.
ISBN: 85-7522-008-X
Novatec Editora Ltda. Rua Cons. Moreira de Barros 1084 Conj. 01 02018-012 São Paulo - SP Brasil Tel.: (0xx11) 6959-6529 Fax: (0xx11) 6950-8869 E-mail: novatec@novateceditora.com.br Site: www.novateceditora.com.br
2
Sumário
Sumário Tcl ...................................................................................... 5 Introdução .................................................................... 5 O interpretador Tcl ....................................................... 6 Compiladores ............................................................... 7 Elementos básicos da sintaxe da linguagem ................ 9 Variáveis reservadas .................................................. 10 Operadores e expressões aritméticas ......................... 11 Expressões regulares ................................................. 11 Coringas ..................................................................... 12 Comandos do Tcl ....................................................... 12 Criação de funções e procedimentos ......................... 15 Acesso ao sistema de arquivos .................................. 16 Entrada e saída em arquivos e portas ........................ 20 Interação com o sistema operacional ......................... 22 Informações sobre o interpretador ............................. 25 Cadeias de caracteres (strings) .................................. 29 Listas .......................................................................... 34 Vetores associativos ................................................... 36 Pacotes ....................................................................... 37 Namespaces ............................................................... 38 Outros comandos ....................................................... 40 CGI .................................................................................. 44 Introdução .................................................................. 44 Variáveis .................................................................... 44 Web sites dinâmicos com Tcl .......................................... 51 Tcl-Httpd Web Server ................................................ 51 embTcl ....................................................................... 52 Tk ..................................................................................... 53 Elementos básicos ...................................................... 53 Opções gerais suportadas pelos widgets ................... 54 Variáveis reservadas .................................................. 56 Configuração das opções dos widgets ....................... 57 Comandos de rolagem (scroll) ................................... 57 Informações sobre as janelas ..................................... 59 Objeto image .............................................................. 64 Objeto toplevel .......................................................... 66 O widget button ......................................................... 67 O widget canvas ........................................................ 68 O widget checkbutton ................................................ 76 O widget entry ........................................................... 77 O widget frame .......................................................... 79 O widget label ............................................................ 80 O widget listbox ........................................................ 80 3
Sumário
O widget menu ........................................................... 83 O widget menubutton ................................................ 86 O widget message ...................................................... 86 O widget radiobutton ................................................. 87 O widget scale ........................................................... 88 O widget scrollbar ..................................................... 89 O widget text ............................................................. 91 Gerenciamento de janelas .......................................... 97 Gerenciamento da disposição dos widgets nas janelas 100 Tratamento de eventos ............................................. 104 Gerenciamento de fontes ......................................... 109 Outros comandos ..................................................... 111 Extensões ....................................................................... 117 BLT .......................................................................... 117 BWidget ................................................................... 117 Tix ............................................................................ 117 GDI e Printer ........................................................... 117 Bancos de dados ...................................................... 118 Informações adicionais .................................................. 119 Bibliografia .............................................................. 119 Referências na Internet ............................................ 119 Sobre o autor ............................................................ 120 Sobre este guia ......................................................... 120 Convenções utilizadas neste guia ............................ 120
4
Tcl
Tcl Introdução A linguagem Tcl/Tk foi desenvolvida pelo Dr. John K. Ousterhout e sua equipe da Universidade da Califórnia, sendo posteriormente mantida pela Sun Microsystems e pela Scriptics. Atualmente o site oficial da equipe de mantenedores é o tcltk.org, uma organização independente, dedicada exclusivamente ao desenvolvimento da linguagem. A Tcl foi desenvolvida para ser essencialmente uma linguagem de script, usada sobretudo como uma ferramenta no desenvolvimento de comandos para o ambiente UNIX. Contudo, acabou mostrando-se excelente, também, para o desenvolvimento de aplicações gráficas avançadas e scripts CGI. A extensão Tk é o Tool Kit gráfico de Tcl e lhe fornece todo o suporte para o rápido desenvolvimento de complexas aplicações gráficas, independente de plataforma e que funcionarão, sem qualquer modificação, em sistemas UNIX, Windows, Mac e até mesmo em handhelds. De fato, Tcl foi portado para praticamente todos os sistemas UNIX existentes, existindo esforços para porta-la para o BeOS e outros sistemas não-UNIX, Windows ou Mac. Como para essas plataformas não suportadas está disponível um pacote escrito em 100% puro Java, que oferece todos os recursos do Tcl/Tk para, virtualmente, qualquer arquitetura existente. Tcl é uma linguagem poderosa, aliando um eficiente compilador JIT a uma sintaxe extremamente simples. O compilador Tcl é tão eficiente, que há pouca diferença, em velocidade, entre um programa Tcl interpretado e sua versão compilada. Algumas das empresas mais importantes e conhecidas, usuárias da linguagem Tcl são a America On-Line e a Nasa. Tendo a America On-Line, desenvolvido um excelente servidor de Web utilizando a Tcl e a NASA um plug-in Tcl para o Netscape Communicator e o Internet Explorer. Empresas como a Lucent e a Motorola utilizam Tcl para simulações. Essa linguagem possui código-fonte aberto e é distribuída gratuitamente sob licença BSD. Para mais informações visite os sites http://www.tcltk.org e http://www.souzamonteiro.com.
5
Tcl
O interpretador Tcl A linguagem Tcl possui dois interpretadores:
tclsh Interpretador em modo texto. Recebe como argumentos o nome do arquivo .tcl, seguido pelos argumentos de linha de comando que deverão ser passados para o programa Tcl. Usado principalmente em scripts CGI. tclsh [arquivo argumento [argumento...]]
wish Interpretador em modo gráfico. Recebe como argumentos o nome do arquivo .tcl, seguido dos argumentos de linha de comando que deverão ser passados para o programa Tcl. Usado para executar aplicativos Tcl/Tk para X-Window, Windows e Mac. wish [arquivo argumento [argumento...]]
Para tornar um script Tcl executável no UNIX, siga os passos: Coloque na primeira linha do script o comentário: #!/usr/bin/wish Caso seu script seja um programa gráfico para o X-Window
ou #!/usr/bin/tclsh Caso seu script seja um scritp CGI.
Para garantir a independência de plataforma, e de acordo com o Tcl Style Guide, utilize a forma: #!/bin/sh # A próxima linha reinicia utilizando o interpretador Tcl/Tk exec wish “$0” “$@”
ou #!/bin/sh # A próxima linha reinicia utilizando o interpretador Tcl/Tk exec tclsh “$0” “$@”
Troque o comando wish pelo interpretador Tcl de sua preferência. Note que os comandos tclsh e wish geralmente são links para as versões mais recentes dos interpretadores Tcl/Tk no computador. Mude as permissões de acesso do arquivo: chmod 755 arquivo.tcl
Onde arquivo.tcl é o nome do script Tcl que se deseja tornar um programa executável. Para executar o programa, simplesmente digite o nome do script na linha de comando do shell UNIX: arquivo.tcl
No Windows, nenhuma configuração adicional será necessária, bastando dar um duplo clique sobre um script com a extensão .TCL que ele será executado (desde que o interpretador Tcl/Tk esteja instalado na máquina). 6
Tcl
Compiladores Existem alguns compiladores Tcl-Wrap, Tcl-C e Tcl-Bytecodes disponíveis na Internet. Os compiladores Tcl-Wrap são na verdade empacotadores de scripts, que criam um programa executável com o interpretador, seu código Tcl e todas as imagens, bibliotecas e arquivos necessários para execução do programa embutido. Os compiladores Tcl-C convertem o código Tcl em código C, que deve ser recompilado por um compilador C ANSI, como o GCC. Os compiladores Tcl-Bytecodes, compilam o código Tcl diretamente para bytecodes, otimizando a velocidade de execução do programa. O melhor compilador Tcl existente é o TclPro, desenvolvido pela Ajuba Solutions, empresa que pertenceu ao criador da linguagem Tcl/Tk. Trata-se de um compilador Tcl-Bytecodes. Esse compilador pode ser adquirido no site http://www.tcltk.org, ou http://dev.scriptics.com. É gratuito e tem código-fonte aberto. Entre os compiladores gratuitos, um dos melhores é o freeWrap. Esse compilador é do tipo Tcl-Wrap. Trata-se de um programa muito bem elaborado, capaz de produzir um programa executável totalmente autocontido e ocupando o menor espaço possível em disco. Para se ter uma idéia, uma instalação completa do kit Tcl/ Tk em ambiente UNIX ocupa aproximadamente 7MB, enquanto um programa compilado com o freeWrap ocupará menos de 500KB. Você pode fazer o download do freeWrap diretamente de meu site: http://www.souzamonteiro.com. Veja a seguir a sintaxe dos programas que acompanham o TclPro:
procomp Compilador bytecode. Converte um script .TCL em um arquivo binário .TBC. Scripts Tcl compilados podem ser carregados da mesma forma que um script não compilado. Contudo, a execução do programa poderá sofrer uma ligeira melhora, e o códigofonte estará protegido. procomp [opções] script [script...]
Opção
Descrição
-force -help -nologo -prefix
Sobrescreve arquivos preexistentes. Apresenta um sumário da sintaxe do comando. Suprime a exibição da mensagem de copyright. Adiciona um prefixo aos arquivos de saída. As opções disponíveis são none, auto, ou tag. Não adiciona a string de prefixo. Extrai o prefixo do arquivo de entrada. Inclui tudo, desde o início do script até a primeira linha que não seja um comentário ou que esteja vazia. Extrai o prefixo do arquivo de entrada. Inclui tudo, desde o início do script até a primeira linha de comentário contendo a string TclPro::Compiler::Include. Suprime as mensagens de avisos. Emite mensagens detalhadas sobre a compilação.
none auto
tag
-quiet -verbose
7
Tcl Exemplo procomp exemplo.tcl Gera o arquivo binário exemplo.tbc.
Para carregar um script Tcl compilado, você deverá carregar o pacote tbcload, ou utilizar um dos interpretadores Tcl que acompanham o TclPro. O pacote tbcload acompanha o TclPro, mas pode ser utilizado com qualquer interpretador Tcl mais recente.
prowrap Empacotador de scripts. Cria um executável autocontido, contendo o interpretador Tcl e todas as bibliotecas e scripts e arquivos necessários para executar o programa. prowrap [opções] script [script...]
Opção
Descrição
-help -nologo -verbose -uses -startup -arguments -executable -relativeto -tcllibrary -code -out -temp -@
Apresenta um sumário da sintaxe do comando. Suprime a exibição da mensagem de copyright. Emite mensagens detalhadas sobre a compilação. Especifica um interpretador Tcl/Tk para ser usado. Especifica o nome do script de inicialização. Argumentos adicionais para o aplicativo. Nome do executável de entrada. Diretório relativo aos arquivos seguintes. Localização das bibliotecas Tcl e arquivos de encoding. Script de inicialização do interpretador. Nome do executável que será gerado. Diretório temporário alternativo. Argumentos adicionais obtidos da entrada-padrão.
Exemplo prowrap exemplo.tcl -out exemplo.exe Gera o arquivo binário exemplo.exe.
procheck Verifica um script em busca de possíveis erros ou problemas de portabilidade. procheck
prodebug Depurador gráfico. prodebug
8
Tcl
Elementos básicos da sintaxe da linguagem Término de linha Linhas de comando devem ser terminadas por nova-linha ou pelo caractere ponto-e-vírgula (;): puts “Alô mundo!”;
Continuação de linha Uma linha de comando muito grande pode ser continuada na linha seguinte, terminando a linha atual com o caractere (\): set texto “Esta linha é muito grande \ e será continuada em uma nova linha”
Comentários Comentários são iniciados com o caractere sustenido (#): # Esta linha é um comentário
Tipos de dados O único tipo de dado em Tcl é string. Entretanto, em alguns casos o interpretador Tcl tentará converter a string para o valor numérico ou booleano correspondente. Os formatos são: Inteiros:
1234
0x7b( hexadecimal) 0173 (octal)
Ponto flutuante: 1.2
1.
1e2
1.2e-3
Booleano:
false
yes
no
true
1
0
Nomes de variáveis Variáveis podem ter qualquer nome: set variavel:um “Esta é a variável 1”
Listas Listas são representadas por valores entre chaves ({ }): set lista {“Esta lista” “contém” “três strings”}
Vetores Vetores são associativos, isto é, seus índices podem ser números ou strings: set vetor(nome) “Roberto Luiz Souza Monteiro”
Vetores podem ter múltiplas dimensões: set vetor(i,j,k) 1.2
Caracteres de substituição O caractere ($) substitui o nome da variável por seu conteúdo: set variavel “Alô mundo !” puts $variavel
Os caracteres ([ ]) substituem o valor retornado pelo comando: puts [glob glob -nocomplain *.ini]
9
Tcl Strings entre aspas (“ “) sofrem substituição: set x [expr expr 1 + 3] puts “O valor de x é $x”
Strings entre chaves ({ }) não sofrem substituição: set x [expr expr 1 + 3] puts {O valor de x é $x}
Caracteres de escape O caractere de escape é a barra invertida (\): \a \espaço \b \nova-linha \f \ddd \n \xdd \r \c \t \\ \v
um sinal sonoro (0x7) espaço backspace (0x8) espaço avanço de página FF (0xC) valor octal nova linha LF (0xA) valor hexadecimal retorno de carro CR (0xD) caractere c tabulaçao horizontal (0x9) caractere \ tabulação vertical (0xB)
Variáveis reservadas Nome
Descrição
argc argv
Número de argumentos passados na linha de comando. String contendo os argumentos passados na linha de comando. Nome do script Tcl que está sendo executado. Vetor associativo em que cada elemento corresponde a uma variável ambiental. Informação sobre o código de erro do último erro ocorrido. Descrição (stack trace) do último erro ocorrido. Localização das bibliotecas Tcl. Versão do patch do interpretador Tcl. Lista dos diretórios onde procurar por pacotes a serem carregados. Vetor contendo os elementos byteOrder, osVersion, machine, platform e os. Número de dígitos significativos a serem retidos quando números de ponto flutuante forem convertidos para strings. Contém o código a ser executado, para exibir o prompt de entrada de comando, quando o interpretador é executado em modo interativo. Usado apenas no modo shell. Contém o código a ser executado, para exibir o prompt de continuação de entrada de comando, quando o interpretador é executado em modo interativo. Usado apenas no modo shell. Nível de informação a ser exibida durante a compilação para bytecodes. Nível de informação a ser exibida durante a execução de bytecodes. Versão do interpretador Tcl.
argv0 env errorCode errorInfo tcl_library tcl_patchLevel tcl_pkgPath tcl_platform tcl_precision
tcl_prompt1
tcl_prompt2
tcl_traceCompile tcl_traceExec tcl_version
10
Tcl
Operadores e expressões aritméticas As operações aritméticas são suportadas, em Tcl, por meio do comando expr. Os seguintes operadores são suportados: Operador
Descrição
-+~! */% +<< >> < > <= >= == != & ^ | && || x?y:z
subtração, soma, NÃO bit a bit, NÃO lógico multiplicação, divisão, resto soma e subtração deslocamento à esquerda e à direita menor que, maior que, menor ou igual, maior ou igual igual e diferente E bit a bit OU EXCLUSIVO bit a bit OU bit a bit E lógico OU lógico se x então y, senão z
As seguintes funções matemáticas são suportadas pelo comando expr: acos, asin, atan, atan2, ceil, cos, cosh, exp, floor, fmod, hypot, log, log10, pow, sin, sinh, sqrt, tan e tanh. Tcl também implementa as seguintes funções para conversão entre inteiros e geração de números aleatórios: Função
Descrição
abs(arg) double(arg) int(arg) rand() round(arg)
Módulo. Converte arg para ponto flutuante. Converte arg para inteiro, truncando a parte decimal. Retorna um número aleatório entre 0 e 1. Converte arg para um número inteiro, arredondando a parte decimal. Retorna um número aleatório, usando arg como a semente para o gerador de números aleatórios.
srand(arg)
Expressões regulares Diversos comandos em Tcl suportam expressões regulares. Nesse caso, os seguintes operadores são suportados: Operador
Descrição
expressão|expressão expressão* expressão+ expressão? . ^ $ \c [abc] [^abc] [a-z] [^a-z] ()
Compara ambas as expressões. Compara zero ou mais ocorrências de expressão. Compara uma ou mais ocorrências de expressão. Compara zero ou uma ocorrência de expressão. Um caractere, exceto \n. Compara o início da string. Compara o final da string. Compara o caractere c, mesmo que ele seja especial. Compara o conjunto de caracteres dado. Compara os caracteres que não estão no conjunto dado. Compara os caracteres na faixa dada. Compara os caracteres que não estão na faixa dada. Agrupa expressões.
11
Tcl
Coringas Diversos comandos em Tcl suportam curingas, em especial os comandos que possuem a opção -glob e o próprio comando glob. Nesse caso, os seguintes operadores são suportados: Operador
Descrição
? *
Substitui um caractere qualquer. Substitui uma ou mais ocorrências de um caractere qualquer. Substitui o conjunto de caracteres. Substitui a faixa de caracteres. Substitui o caractere c. Substitui as strings str1, str2, str3 etc. Diretório do usuário. Diretório do usuário nome.
[abc] [a-z] \c {str1,str2,str3,...} ~ ~nome
Comandos do Tcl Controle de fluxo break Interrompe o laço mais interno. break
continue Avança para a próxima interação do laço mais interno. continue
exit Termina o processo em execução. exit [código]
Argumento
Descrição
código
Código de retorno passado ao shell. O default é 0.
for Executa um laço. for início condição próximo corpo
Argumento
Descrição
início condição
Comando Tcl usado para inicializar a variável contador. Uma condição que deverá ser avaliada como verdadeira para que o laço seja executado. Comando Tcl usado para preparar uma nova interação do laço. Geralmente incrementa a variável contador. Script Tcl que será avaliado a cada interação do laço.
próximo corpo
Exemplo for {set i 0} {$i <10} {incr i} { puts $i } O fragmento de código acima exibirá os números de 0 a 9 no console.
12
Tcl
foreach Percorre uma lista, atribuindo cada um de seus elementos a uma variável e executando um script Tcl a cada interação. foreach variável lista corpo foreach lista1_variáveis1 lista1 [lista2_variáveis2 lista2] corpo
Argumento
Descrição
variável
Nome de uma variável que conterá o valor de cada elemento da lista, a cada interação do laço. Lista Tcl. Script Tcl que será avaliado a cada interação do laço. Lista de variáveis às quais serão atribuídos os elementos correspondentes da lista dada. Lista Tcl. Lista de variáveis às quais serão atribuídos os elementos correspondentes da lista dada. Lista Tcl.
lista corpo lista1_variáveis lista1 lista2_variáveis lista2
Exemplo set cores {vermelho alaranjado amarelo verde azul anil violeta} foreach cor $cores{ puts $cor } O fragmento de código acima exibirá as cores do espectro visível da luz no console.
if Executa um script Tcl, caso uma condição dada seja avaliada como verdadeira. if expressão1 [then] corpo1 elseif expressão2 [then] corpo2 [else] [corpoN]
Argumento
Descrição
expressão1 then
Expressão booleana. Indica o script a ser avaliado, caso a expressão dada seja avaliada como verdadeira. Opcional. Script a ser executado, caso a expressão dada seja avaliada como verdadeira. Indica uma condição a ser avaliada. Condição que, se avaliada como verdadeira, fará com que o script dado seja executado. Script a ser executado, caso a expressão dada seja avaliada como verdadeira. Indica um script a ser avaliado, caso as condições dadas sejam avaliadas como falsas. Script a ser executado, caso a expressão dada seja avaliada como verdadeira.
corpo1 elseif expressão2 corpo2 else corpoN
13
Tcl Exemplo set x 2 if {$x = 1} { puts “O valor de x é 1” } elseif {$x = 2} { puts “O valor de x é 2” } elseif {$x = 3} { puts “O valor de x é 3” } else { puts “O valor de x é incompreensível” } O fragmento de código acima exibirá a mensagem “O valor de x é 2” no console.
return Retorna do procedimento atual passando uma string como valor de retorno. return [-code código] [-errorinfo informação] [-errorcode código] [string]
Argumento
Descrição
-code
Codigo de retorno. Pode ser: ok, error, return, break, continue, ou um valor inteiro. Informação sobre o erro ocorrido. Código do erro ocorrido. String que deverá ser retornada ao procedimento que chamou a função.
-errorinfo -errorcode string
switch Compara uma string com padrões predefinidos, executando a porção de código correspondente. switch [opção] string {padrão1 corpo1 [padrão2 corpo2]... [default corpoN]}
Argumento
Descrição
opção -exact -glob
Opção de comparação. Realiza uma comparação exata. Realiza uma comparação no modo do comando glob do UNIX. Aceita coringas. Trata a string dada como uma expressão regular. String a ser comparada com os padrões predefinidos. Uma constante, que será comparada à string dada. Caso uma equivalência seja encontrada, o corpo de código correspondenteseráavaliado.Umnúmeroilimitadodepadrões podem ser definidos, e cada um deverá ser seguido de um corpo de código correspondente. Corpo de código que deverá ser avaliado, caso o padrão correspondente seja equivalente à string dada. Define o corpo de código default, que será executado caso nenhum dos padrões predefinidos sejam equivalentes à string dada. Corpo de código default.
-regexp string padrão1...
corpo1... default
corpoN
14
Tcl Exemplo set x “arquivo” switch $x { arquivo {puts “Você escolheu a opção arquivo”} editar {puts “Você escolheu a opção editar”} ajuda {puts “Você escolheu a opção ajuda”} } O fragmento de código acima exibirá a mensagem “Você escolheu a opção arquivo” no console.
while Executa um laço, avaliando o código em corpo, enquanto uma condição dada for avaliada como verdadeira. while condição corpo
Argumento
Descrição
condição
Uma expressão booleana que deverá ser avaliada como verdadeira para que ocorra uma interação do laço. Script Tcl que será avaliado a cada interação do laço.
corpo
Exemplo set x 0 while {$x < 10} { puts $x } O fragmento de código acima exibirá os números de 0 a 9 no console.
Criação de funções e procedimentos proc Cria um novo procedimento Tcl, ou substitui um procedimento existente. proc nome argumentos corpo
Argumento
Descrição
nome argumentos corpo
Nome do procedimento criado. Lista de argumentos, entre chaves e separados por espaço. Script que será executado quando o procedimento for invocado.
Exemplo proc x2 {valor} { return [expr $valor * $valor] } O fragmento de código acima criará uma função que calculará o quadrado de um número.
15