Tutorial Tcl/Tk ===================================== Danilo Pacheco Martins Fernando Wuthstrack Quinta, 27 de maio de 2006 Resumo ------ Este tutorial tem por objetivo ser uma referencia ao aprendizado no uso do Tcl/Tk. E uma otima ferramenta para desenvolvimento grafico, e a sua grande vantagem de rodar em varias plataformas, sem que seja preciso mudar seu fonte. Duvidas, criticas e sugestoes favor postar para o e-mail: danilo@infocont.com.br -------------------------------------------------------------------------------------- Conteudo -------- 1 - O que e Tcl/Tk. 2 - Conceitos basicos do Tcl/Tk. 3 - Fazendo o Cobol "conversar" com o Tcl/TK. 4 - Instalando o Tcl/TK no Windows. 5 - Compilando o programa cadastro.cob. 6 - Duvidas. 7 - Apendice. -------------------------------------------------------------------------------------- 1 - O que e Tcl/Tk Tcl (Tool Command Language) e uma linguagem de script usada por meio milhao de programadores ao redor do mundo e se tornou um componente critico em milhares de corporacoes. Ele tem uma sintaxe simples e programavel e pode ser usado como uma aplicacao standalone ou embutida em outras aplicacoes. O melhor de tudo, e que o Tcl e Open Source e completamente gratis. Tk e um toolkit para criacao de interface graficas com o usuario, possibilitando assim criar GUIs poderosas e inacreditavel mente rapidas, ao contrario de aplicacoes desenvolvidas em outras linguagens Interpretadas ou ate mesmo pre compiladas. Provou-se tao popular que agora vem em todas as distribuicoes do Tcl. Tanto o Tcl como o Tk foram desenvolvidos por John Ousterhout. Programadores seguiram o exemplo dele no mundo inteiro e construiram as proprias extensoes de Tcl. Hoje, ha centenas de extensoes do Tcl para todas as necessidades de aplicacoes. Tcl e Tk sao altamente portateis e sao executadas praticamente todos os sabores de Unix, (Linux, Solaris, IRIX, AIX, *BSD *), nao podemos deixar de falar que ha suporte para o Windows e Macintosh. Ha varios locais que proveem binarios de precompiladores para varias plataformas. Tcl e Tk sao Open Source e o desenvolvimento continuo dele e feito com a colaboracao dos engenheiros da Scriptics (www.scriptics.com) e usuario da comunidade Tcl. A Scriptics mantem um repositorio de CVS para o codigo fonte. Todos podem enviar mudancas e correcoes ao codigo fonte do Tcl/TK. Caso seja encontrado algum erro no Tcl/TK voce podera comunica-lo diretamente a Scriptics utilizando o relatorio de Bugs. 1.1 - Tcl: A Plataforma de Integracao Hoje em dia um dos grandes problemas enfrentado pelos desenvolvedores de solucoes e a diversidade de plataformas que poderao ser encontradas nas empresas. O Tcl e chamado de programacao de aplicacoes para integracao. Para empreendimentos, a plataforma de integracao esta ficando tao estrategicamente importante quanto o Sistema Operacional e os bancos de dados. Tcl e a melhor plataforma de integracao por causa de sua velocidade de uso, largura de funcionalidade, e caracteristicas para empreendimento prontas como linha-seguranca, internacionalizacao e desenvolvimento multiplataforma. O comentario acima foi feito com base no Site: http://tclbrasil.cipsga.org.br/tcltk.htm -------------------------------------------------------------------------------------- 2 - Conceitos basicos do Tcl/Tk. 2.1 - Janela principal. 2.1.1 Definindo titulo da janela. wm title . "Titulo da Janela" 2.1.2 Definindo tamanho da janela. wm geometry . XXXxYYY Ex: wm geometry . 500x500 2.2 - Variaveis 2.2.1 Declarando as variaveis do Cobol. As variaveis vindas do Cobol tem por obrigatoriedade ser do tipo string e terao que ter o mesmo tamanho declarado no fonte Cobol. A forma de passagem de parametros do Cobol para o Tcl/Tk sera tratada mais adiante. A declaracao do grupo "cobol_fields" e obrigatoria e nao pode ser alterada. set cobol_fields { variavel_1 5 variavel_2 25 variavel_3 40 } Observacao: O numero apos o nome da variavel e' o seu tamanho. 2.2.2 Definindo um valor para uma variavel. Para definir um valor para uma variavel, voce usara a seguinte sintaxe: set nome_da_variavel valor Ex: set vnome Jose Neste caso ele inseriu o nome "Jose" na variavel "vnome", o valor atribuido nao precisa necessariamente estar entre "" (aspas), a nao ser que voce queira inserir mas de uma palavra, como por ex: vnome set "Jose da Silva" 2.2.3 Recebendo o valor de uma variavel. Sempre que voce quiser receber o valor de uma variavel, ela tera que ser precedida do "$" (dolar), como por exemplo: set vnome1 $vnome2 Neste caso a variavel "vnome1" recebeu o valor da variavel "vnome2" 2.3 - Inserindo uma condicao. O comando if e utilizado para avaliar se uma condicao. dada e verdadeira ou falsa. Caso a condicao seja verdadeira ele podera executar uma serie de comandos ou, se falsa, ira executar outra serie de comandos de acordo com o definido pelo programador. Sintaxe: if {condicao1} [then] {corpo se verdadeiro} [else {corpo se falso} [elseif {condicao2} {corpo}]] onde: {condicao1}, e a primeira condicao a ser avaliada [then], e opcional apos a condicao que sera avaliada, e utilizado para indicar o que sera executado caso a condicao seja verdadeira. {corpo se verdadeiro}, e o que sera executado se a condicao avaliada for verdadeira. [else], e utilizado para indicar algo que devera ser feito se a condicao avaliada for falsa. {corpo se falso}, e o que devera ser executado quando a condicao avaliada for falsa. [elseif], e utilizado para fazer uma segunda verificacao condicional dentro do mesmo if. {condicao2}, e a segunda condicao que sera avaliada pelo elseif. {corpo}, o mesmo que {corpo se verdadeiro}. 2.4 - Inserindo uma rotina de repeticao. O comando while ira executar uma serie de comandos enquanto uma condicao for verdadeira, caso na primeira verificacao ja for verificado que a condicao e falsa nenhum comando do corpo sera executado, semelhante ao PERFORM do Cobol. Sintaxe: while {condicao} {corpo} Onde: {condicao}, sera a condicao verificada a cada loop para continuar ou parar o laco de repeticao. {corpo}, sao os comandos que deverao ser repetidos a cada loop Exemplo: set var1 0 while {$var1 < 10} { incr var1 } 2.5 - Procedures. E possivel no Tcl criar procedures (semelhante o PERFORM do Cobol), a sintaxe: proc {valores} {corpo} Exemplo: proc atribui_valor {a b c} { set valor1 $a set valor2 $b set valor3 $c } A chamada da procedure acima, seria feita da seguinte maneira: atribui_valor "primeiro" "segundo" "terceiro" 2.6 - Bind. O comando bind e utilizado para associar eventos do teclado ou mouse a objetos do Tk. Exemplo: label .lab entry .entcodigo bind .entcodigo {.lab configure -text "Voce entrou no campo Codigo"} bind .entcodigo {.lab configure -text "Voce saiu do campo Codigo"} No caso acima, quando o cursor entrar no ".entcodigo", o ".lab" vai exibir: "Voce entrou no campo Codigo", e quando sair ele vai exibir: "Voce saiu do campo Codigo" 2.7 - Componentes Tk. Existem varios componente do Tk, em nosso tutorial usamos entry, label, button e listbox. Todo nome atribuido a um componente deve proceder de um ponto ".". 2.7.1 Label. Label e um componente de texto, apenas para exibir(ex: identificar campos). Grotescamente podera ser comparado ao DISPLAY do Cobol. A sintaxe para criar um label e a seguinte: label nome_do_label Exemplo: label .codigo No caso acima ele criou um label com o nome "codigo". Existem varias propriedades para um label, como por exemplo -text, -foregorund, -background e etc. Exemplo: label .codigo -text Codigo -foreground blue -background white No caso acima, o label codigo tera o valor "Codigo", letra azul e fundo branco. Observacao: se voce quiser que o texto do label tenha mais de uma palavra, voce tera que coloca-lo entre "" (aspas). Exemplo: -text "InfoCont Sistemas Integrados" Para associar a propriedade -text a uma variavel, voce tera que declara-la da seguinte maneira: -textvariable var Neste caso, sempre que a variavel "var" mudar de valor, o texto do label tambem sera modificado. 2.7.2 Entry. Entry e um componente ao qual permite com que voce atribua valor a sua propriedade texto via teclado. Semelhante ao ACCEPT do Cobol. A sintaxe para criar um entry e a seguinte: entry nome_do_entry Exemplo: entry .endereco No caso acima ele criou um entry com o nome de "endereco". Existem varias propriedade para um entry, como por exemplo -text, -foreground, -background e etc. Exemplo: entry .endereco -text desendereco -foreground blue -background white Neste caso, o entry "endereco" ira atualizar o valor da variavel "desendereco", com letra azul e fundo branco. 2.7.3 Button. Button e um componente que aciona algum procedimento quando acionado. A sintaxe para criar um Button e a seguinte: button .nome_do_botao Exemplo: button .but No caso acima ele criou um botao com o nome de "but" Existem varias propriedade para um botao, como por exemplo -text, -foregorund, -background -command e etc. Exemplo: button .but -text Sair -foreground blue -command {exit} Neste caso, o rotulo do botao "but" sera "Sair", letra azul e fechara a tela quando ele for acionado, se voce quiser fazer mais de um procedimento quando um botao for acionado, voce tera que separar um procedimento do outro com ";" (ponto-e-virgula). 2.7.4 ListBox. ListBox e um componente que mostra uma lista de itens. A sintaxe para criar um ListBox e a seguinte: listbox .lista No caso acima ele criou um listbox com o nome de "lista" Existem varias propriedades para um listbox, como por exemplo -selectmode -yscrollcommand e etc. -Exemlo: listbox .lista -selectmode browse -yscrollcommand {.rolagemv set} Neste caso ele definiu o tipo de selecao como "browse" a associou uma barra de rolagem vertical, que sera utilizada quando o numero de itens for superior ao tamanho fisico do componente (vide scrollbar). 2.7.5 Scrollbar. Scrollbar e um componente que serve como barra de rolagem para outros componentes. A sintaxe para criar um Scrollbar e a seguinte: scrollbar nome_do_scrollbar Existem varias propriedades para um Scrollbar, como por exemplo -orient e -command Exemplo: listbox .lista -selectmode browse -yscrollcommand {.rolagemv set} scrollbar .rolagemv -orient vertical -command {.lista yview} Neste caso ele criou um listbox e um scrollbar, onde o scrollbar esta na vertical, e ele ira mover para cima ou para baixo a lista do ListBox. 2.7.6 TopLevel TopLevel, e um comando que cria uma nova janela. A sintaxe para criar um toplevel e a seguinte: toplevel .nome_janela Exemplo: toplevel .cadastro No caso acima ele criou uma nova janela com o nome de "cadastro" Para setar a altura usa-se o comando -height altura_da_janela para setar a largura usa-se o comando -width largura_da_janela se voce quiser criar algum componente nesta janela voce tera que colocar o nome da janela antes do nome do componente, como por exemplo: button .cadastro.but -text "Sair" -command {exit} No caso acima ele criou um botao chamado "but" na janela chamada "cadastro" o rotulo desse botao e "Sair" e quando ele for pressionado, ele ira fechar o programa. 2.8 - Place. O Place e um comando com a utilidade de posicionar os objetos na janela. Sua sintaxe e a seguinte: place nome_do_objeto -x posicao_horizontal -y posicao_vertical -height altura -width largura Comandos principais: -x : indica quantos pixels na horizontal o objeto deve se posicionar. -y : indica quantos pixels na vertical o objeto deve se posicionar. -height : indica a altura do objeto em pixels. -width : indica a largura do objeto em pixels. Exemplo: place .entcidade -x 10 -y 15 -height 20 -width 170 No caso acima o componente "entcidade" estara 10 pixels na horizontal, da janela criada 15 pixels na vertical, 20 pixels de altura, e 170 pixels de largura. 2.9 - Grid. Grid e um outro metodo para organizar objetos na tela, muito mais pratico que o place, ele cria uma tabela invisivel na tela, e voce vai colocando cada widget em uma celula dessa tabela, facilitando o trabalho, pois voce nao precisa ficar se preocupando em alinhar os objetos, o grid faz isso sozinho, o largura da coluna, e' do tamanho do componente mais largo da coluna, e a altura da linha, e' o tamanho do componente mais alto da linha. Exemplo: button .but1 button .but2 button .but3 button .but4 grid .but1 .but2 grid .but3 .but4 no caso acima foi criado quatro botoes e exibido na tela com o comando grid, existem varias opcoes para o grid, como por exemplo: -sticky nsew, isso indicara em que posicao da celula ficara o objeto, caso a celula seja maior que o objeto, nesse exemplo, ela ficara na posicao norte, sul, leste e oeste, ou seja, o tamanho do objeto, sera o tamanho da celula. 2.10 Pack. Pack, e' uma outra maneira de se organizar objetos na tela. E' como se ele jogasse os objetos para os cantos, na opcao -side voce define em que canto o objeto sera jogado: para cima(top), para a esquerda(left), direita(right) ou para baixo(bottom). A opcao -anchor, em que posicao do lado o objeto ira ficar, norte(n), sul(s), leste(e) ou oeste(w) por exemplo: button .but1 button .but2 button .but3 button .but4 pack .but1 .but2 .but3 .but4 -side right -anchor nw Nesse exemplo, foram criados quatro botoes, eles irao aparecer no canto direito superior, nao importando se voce altere o tamanho da janela. -------------------------------------------------------------------------------------- 3 - Fazendo o Cobol "conversar" com o Tcl/TK. 3.1 - Trabalhando com as variaveis do Cobol. As variaveis associadas ao Tcl/TK, deverao ser declaradas na WORKING-STORAGE SECTION. Voce ira declarar uma variavel do nivel 1, e as variaveis pertencentes ao Tcl/TK deverao estar dentro dela, o nome das variaveis, fica a seu criterio. Sera necessario declarar mais uma variavel PIC X(64) que servir para identificar o nome do arquivo TCL. Veja o exemplo abaixo: 01 VARIAVEIS-TCL. 03 TCL-CODIGO PIC X(04). 03 TCL-NOME PIC X(40). 03 TCL-ENDERECO PIC X(40). 01 NOME-TELA PIC X(64). Neste exemplo, declaramos a variavel "VARIAVEIS-TCL", nela estarao todas as variaveis que o Tcl/TK ira usar. E imprescindivel que o tamanho das variaveis no Cobol seja o mesmo das variaveis declaradas no Tcl/Tk e que tem por obrigatoriedade ser PIC X, tendo em vista que o Tcl/Tk nao permite a declaracao de campos numericos. Posteriormente declaramos a variavel "NOME-TELA", que sera o nome do arquivo da tela (script Tcl/Tk) que voce ira chamar. Digamos que fizemos uma tela com o nome de "cadastro.tcl", entao a variavel "NOME-TELA" receberia o valor "cadastro.tcl". Veja no indice 3.2 (proximo) para saber como elas serao usadas. 3.2 - Chamando a tela. Antes de tudo voce tera que chamar o programa "initTcl". Ele inicializa o ambiente grafico. Faca isso no comeco do programa, antes de comecar qualquer rotina. A chamada da tela Tcl/TK e efetuada atraves da rotina "tcleval", que e um programa escrito em linguagem C, que possui um interpretador de scripts TCL/TK. Ele e responsavel por executar a tela e transportar os conteudos das variaveis do Cobol para o Tcl/TK e vice-versa. Para chamar a tela, voce tera que executar o programa "tcleval" atraves do comando CALL, usando as variaveis do Tcl/Tk e a variavel com o nome do programa, usando o mesmo exemplo anterior: 01 VARIAVEIS-TCL. 03 TCL-CODIGO PIC X(04). 03 TCL-NOME PIC X(40). 03 TCL-ENDERECO PIC X(40). 01 NOME-TELA PIC X(64). Digamos que a tela que voce ira chamar, e "cadastro.tcl", entao no Cobol fariamos da seguinte maneira. MOVE "cadastro.tcl" TO NOME-TELA. CALL "tcleval" USING VARIAVEIS-TCL NOME-TELA. No caso acima, quando o CALL fosse executado, ele chamaria a tela escrita em Tcl/TK "cadastro.tcl" e as variaveis do "cobol_field" no Tcl/TK receberiam os valores vindos do Cobol. 3.3 - Voltando para o Cobol. Voltar do Tcl/TK para o Cobol, e muito simples, voce tera que executar no Tcl/TK o comando "do_exit", fazendo isso os valores das variaveis do "cobol_fields" serao movida para as variaveis do Cobol, conforme voce declarou na WORKING-STORAGE SECTION, dai cabe a voce fazer uma rotina, para que o Cobol receba os valores e volte para a chamar a tela, mostrando os novos valores processados. 3.4 - Como funciona a rotina do tutorial. No exemplo do nosso tutorial, temos uma variavel declarada no Cobol com o nome de "TCL-OPCAO", com a correspondente "tclopcao" no Tcl/TK. O Cobol chama o Tcl/TK atraves do "tcleval" e a tela e exibida. Quando voce clica em algum botao, ou tira o foco do campo "codigo", ele atribui a acao para a variavel tclopcao e executa o "do_exit". Este comando ira retornar o processamento para o Cobol, transportando as variaveis vindas do Tcl/TK. O Cobol le a variavel "TCL-OPCAO" e executa a rotina correspondente a opcao e retorna para o Tcl/Tk. Exemplo: Na WORKING-STORAGE SECTION atribuimos a variavel "NOME-PROGRAMA" com o valor "cadastro.tcl", que e o nome do arquivo do Tcl/TK. No inicio do programa Cobol executamos o "iniTcl" (CALL "initTcl".). Antes de chamar a tela pela primeira vez inicializamos as variaveis que serao usadas pelo Tcl/TK, para que tela seja exibida com os campos vazios. Como a variavel "NOME-PROGRAMA" ja esta carregado com o nome da janela, chamamos a tela (CALL "tcleval" USING VARIAVEIS-TCL NOME-PROGRAMA). Isto ira chamar a tela do Tcl/TK. Digamos que o usuario queira gravar um registro, entao ele ira preencher os dados e depois ira clicar no botao "Gravar". Quando ele clicar em gravar, o Tcl/TK ira atribuir a variavel "tclopcao" o valor "gra" e fara o comando "do_exit" (-command {set tclopcao gra ; do_exit}) que ira fazer com que o processamento retorne ao programa Cobol, com os novos valores da variaveis. O Cobol ira ler a variavel "TCL-OPCAO", que tera o valor "gra", e executara um PERFORM para a secao "1000-GRAVA", onde os valores das variaveis vindas do Tcl/TK serao movidas para a FD "CADASTRO" e sera executa a gravacao. Na seqüencia o programa inicializara as variaveis do Tcl/TK, atribuira uma mensagem descrevendo o resultado do processo de gravacao para a variavel "TCL-MENSAGEM" e saira da rotina, retornando ao Tcl/TK (tcleval). A tela sera exibida com o novos valores vindos do Cobol. No script Tcl/TK temos um label que esta vinculada a variavel "tclmensagem", que no retorno sera atualizada e exibira ao usuario o resultado da acao. Resumido, o Cobol chama o Tcl/TK, o usuario modificara os valores das variaveis, voltara para o Cobol. O Cobol, por sua vez, ira identificar o desejo do usuario, ira executar o processo correspondente e retornara ao Tcl/TK, -------------------------------------------------------------------------------------- 4 - Instalando o Tcl/TK no Windows. 4.1 - O melhor caminho para baixar o TCL/TK para Windows é através pacote ActiveTCL, distribuido pela ActiveState. O interpretador TCL/TK é totalmente free. Para realizar o download do ActiveTCL, acesse o endereço abaixo: http://www.activestate.com/Products/ActiveTcl O ActiveTCL trás, além do interpretador TCL/TK, inúmeros pacotes de componentes, como o Iwidget e o Bwidgets, que agregam funções como suporte à campos editados, calendários, utilitários para busca e seleção de arquivos e inúmeros outros recursos. A instalação do ActiveTCL também é bastante simples, sendo necessário apenas confirmar todos os passos do processo. Após a instalação é criado um grupo de programas denominado ActiveState ActiveTCL, onde estão disponíveis os interpretadores e também o grupo Demos, onde se encontram disponíveis todos os componentes agregados na instalação, com exemplos em tempo de execução e também do código que deverá ser implementado na sua aplicação. A partir deste momento, você já terá acesso à todas as funcionalidades do TCL/TK, sem a necessidade de qualquer configuração adicional. As interfaces criadas em TCL/TK já poderão ser visualizadas e processadas. 5 - Compilando o programa cadastro.cob. 5.1 Para compilar e gerar o executável de cadastro.cob digite: htcobol -vC cadastro.cob Informacoes: - O TC suporta a integração com o TCL/TK via call's a um interpretador TCL/TK atraves um wrapper(empacotador) criado pelo Rildo. Esta rotina (initTcl.dll) já se encontra devidamente compilada e presente no diretório C:\TinyCOBOL\bin. 6 - Duvidas e Sugestoes. Poste suas duvidas e ou sugestoes para a lista abaixo, sendo que o topico devera ser enviado para lista adequada. 6.1 Tinycobol. Lista cobol@yahoogrupos.com.br http://br.tinycobol.org http://wiki.tinycobol.org 6.2 TCL/TK lista tcl-br@yahoogrupos.com.br http://tclbrasil.cipsga.org.br http://www.ricardo-jorge.eti.br http://www.tcl.tk 7 - Apendice. 7.1 - Agradecimentos. - Carlucio Lopes que, atraves do seu tutorial, nos permitiu dar os primeiros passos com o Tcl/Tk; - Rildo Pragana pelos primeiros exemplos com Tcl/TK com o TinyCobol e pela paciencia em nos ajudar a superar algumas barreiras encontradas; - John Ousterhout por criar a linguagem TCL e o toolkit grafico TK. - Wesley R. Braga, criador do site tclbrasil.cipsga.org.br - Ricardo Jorge, grande colaborador da lista tcl-br. 7.2 Colaboradores. - Danilo Pacheco Martins - Fernando Wuthstrack - Carlucio Lopes - Rildo Pragana - Wesley R. Braga