Introdução à Programação Python e Tk

Preview:

DESCRIPTION

Lâminas para um curso de Python e Tk

Citation preview

1

Introducao a Programacao em Python eTk

Carlos A. P. Campani

22 de abril de 2005

2

Copyright c©2005 Carlos A. P. Campani.

E garantida a permissao para copiar, distribuir e/ou

modificar este documento sob os termos da Licenca de

Documentacao Livre GNU (GNU Free Documentation

License), Versao 1.2 ou qualquer versao posterior

publicada pela Free Software Foundation; sem Secoes

Invariantes, Textos de Capa Frontal, e sem Textos de

Quarta Capa. Uma copia da licenca e incluıda na secao

intitulada ”GNU Free Documentation License”.

veja: http://www.ic.unicamp.br/~norton/fdl.html.

REFERENCIAS 3

Referencias

[1] Catunda, Marco Python: guia de consulta rapida, Ed.

Novatec, 2001.

[2] Python Documentation Index.

http://www.python.org/doc/.

[3] Lundh, Fredrik An Introduction to Tkinter, 1999.

http://www.pythonware.com/library/tkinter/

an-introduction-to-tkinter.pdf

REFERENCIAS 4

Links

(Python Language Website)

http://www.python.org

(Python Resources)

http://www.vex.net/parnassus/

(Tcl/Tk Site)

http://www.tcl.tk

REFERENCIAS 5

Material do Curso

(Laminas do curso)

http://www.ufpel.tche.br/~campani/laminas.pdf

(Laminas para Impressao)

http://www.ufpel.tche.br/~campani/laminas4.ps.gz

(Programas exemplo)

http://www.ufpel.tche.br/~campani/FileDialog.tar.gz

http://www.ufpel.tche.br/~campani/swpackage.tar.gz

REFERENCIAS 6

Programas

• Python 2.1;

• Tk 8;

• Python-tkinter 2.1;

• vi;

• emacs;

• gnuplot e modulo Gnuplot;

REFERENCIAS 7

• Numeric 2.0;

• MySQL 3;

• Python-MySQLdb;

• XFreeGL (OpenGL)/ Mesa3D;

• PyOpenGL 2.

• PIL 1.1.5

REFERENCIAS 8

Obtendo os Programas

• Pacotes rpm ou tarball;

• Binario (pre-compilado) ou source (tem que compilar);

• Paginas oficiais dos programas;

• Distribuicoes Linux;

• http://rpmfind.net;

• http://sourceforge.net.

REFERENCIAS 9

Instalando os Programas em Linux

Instalando pacotes rpm:

$ su

<senha de root>

% rpm -i <arquivo pacote>

% ^D

$

Compilando o fonte:

$ su

<senha de root>

% cd <diretorio do fonte>

% ./configure

% ./make

% ./make install

1 OBJETIVOS DO CURSO 10

1 Objetivos do Curso

• Introduzir a linguagem Python para alunos que ja

saibam programar;

• Mostrar, de forma introdutoria, aspectos avancados

de Python, tais como scripts para web, acesso a

MySQL, suporte a audio e OpenGL;

• Introduzir o toolkit Tk e mostrar como desenvolver

rapidamente aplicacoes baseadas em janelas

usando-o.

2 CARACTERISTICAS DE PYTHON 11

2 Caracterısticas de Python

• Criada por Guido van Rossum em 1991;

• Evolucao do C

• Linguagem de script e linguagem de programacao;

– Exemplos de linguagens de script: Tcl, Perl, etc.

– Objetivo: substituir C e Java;

• Interpretada e interativa;

• Multiplataforma: Unices, Windows e Mac (no Linux

e pre-instalado);

• Possui suporte a POO;

2 CARACTERISTICAS DE PYTHON 12

• Estruturas de controle e de dados avancadas (mais

poderosas que C e Java);

– Lista encadeada e tabela hash como primitivas da

linguagem;

– Tratamento de erros de execucao;

• Dispensa BEGIN e END (obriga a endentacao e a

estruturacao do programa);

• Tipagem dinamica (nao e necessario declarar

variaveis);

• Combinados, os ultimos tres itens significam que os

programas em Python sao muito menores e mais

“limpos” que os equivalentes em C e Java;

2 CARACTERISTICAS DE PYTHON 13

• Mais verificacoes de erros de sintaxe/execucao que C;

• Modular (organiza o namespace);

from Tkinter import *

root = Tk()

ou

import Tkinter

root = Tkinter.Tk()

• Ideal para prototipacao rapida de aplicacoes;

• Graficos em janelas usando-se modulo Tkinter;

• Pode ser extendida usando-se C e C++

(escrevendo-se novos modulos);

2 CARACTERISTICAS DE PYTHON 14

• Profiling;

• Programacao cientıfica (NumPy e Gnuplot);

• Computacao grafica (PyOpenGL);

• Acesso ao servidor MySQL (Python-MySQLdb);

• Linguagem de Cola (glue language);

Exemplo: voce pode usar em FORTRAN aquele

pacote grafico que so funciona em C;

• Scripts CGI (usando-se modulo CGI);

• Finalmente: E software livre!

3 TEORIA VERSUS PRATICA 15

3 Teoria Versus Pratica

• “Aprender a sintaxe de uma linguagem nao e tudo”;

• Metodologia de desenvolvimento de software;

– Metodos sistematicos;

– Reducao de problemas;

– Herdar resultados;

– Semantica formal;

• Teoria e pratica andam juntas.

4 USANDO O INTERPRETADOR 16

4 Usando o Interpretador

4.1 Usando o Interpretador - Modo Interativo

$ python

Python 2.1 (#1, jul 4 2001, 23:56:02)

[GCC 2.95.3 200110315 (release) (conectiva)] on linux-i386

Type "copyright", "credits" or "license" for more information.

>>>

4 USANDO O INTERPRETADOR 17

Control-D abandona o interpretador.

>>> ^D

$

4 USANDO O INTERPRETADOR 18

>>> 2+2

4

>>> 2+

File "<stdin>", line 1

2+

^

SyntaxError: invalid syntax

>>> # Este e um comentario

... 2*2

4

>>> 7/3

2

>>> 7./3.

2.3333333333333335

Observe o prompt secundario ...

4 USANDO O INTERPRETADOR 19

>>> 1/0

Traceback (most recent call last):

File "<stdin>", line 1, in ?

ZeroDivisionError: integer division or modulo by zero

>>> print "Esta e uma linha extremamente\

... longa que foi dividida."

Esta e uma linha extremamente longa que foi dividida.

>>>

4 USANDO O INTERPRETADOR 20

Atencao!

• Atribuicao: =;

• Igualdade: ==.

(inspirado em C)

4 USANDO O INTERPRETADOR 21

>>> a = 10

>>> a

10

>>> a += 1

>>> a

11

>>> b = c = 0

>>> a,b = b,a

>>> a

0

>>> b

11

>>> c

0

4 USANDO O INTERPRETADOR 22

>>> x = 15

>>> x

15

>>> x = 3.1415

>>> x

3.1415000000000002

Lembre-se: Tipagem dinamica!

4 USANDO O INTERPRETADOR 23

>>> print "Ola, mundo!"

Ola, mundo!

>>> x = 15

>>> print x+1,x-1,2*x,x/2

16 14 30 7

>>> print "x=%d"%x

x=15

>>> y = 1.5

>>> print "x=%d\ny=%4.2f"%(x,y)

x=15

y=1.50

4 USANDO O INTERPRETADOR 24

>>> z = "x=%d\ny=%4.2f"%(x,y)

>>> print z

x=15

y=1.50

>>> print "x=";print x

x=

15

>>> print "x=",;print x

x= 15

4 USANDO O INTERPRETADOR 25

>>> if 1: print "verdadeiro"

...

verdadeiro

>>> if 0: print "verdadeiro"

...

>>>

Observacoes:

• Valores-verdade: 0 e 1;

• ... e o prompt secundario.

4 USANDO O INTERPRETADOR 26

>>> if x<10:

... print x,

... print "menor"

... else:

... print x,

... print "maior"

...

15 maior

>>>

Observacoes:

• Observe o prompt secundario ao final da estrutura;

• Nao misturar espacos e tabulacoes em um mesmo

bloco (erro!).

4 USANDO O INTERPRETADOR 27

Tupla:

>>> x=(1,2,3)

>>> x[0]

1

>>> x[1]

2

>>> x[-1]

3

>>> x[-2]

2

>>>

4 USANDO O INTERPRETADOR 28

Lista encadeada:

>>> x = [1,2,3]

>>> x

[1,2,3]

>>> x[0] = 10

>>> x

[10,2,3]

>>> x+[4,5]

[10,2,3,4,5]

>>> x

[10,2,3]

>>> x.append(1000)

[10,2,3,1000]

4 USANDO O INTERPRETADOR 29

>>> x

[10,2,3,1000]

>>>

4 USANDO O INTERPRETADOR 30

String:

>>> x = "Gremio FBPA"

>>> y = " - o maior de todos"

>>> print x+y

Gremio FBPA - o maior de todos

Funcao:

>>> x = float

>>> x

<built-in function float>

>>> x(2)

2.0

4 USANDO O INTERPRETADOR 31

Binding: amarracao entre nomes e valores em um

namespace.

Sempre que ocorre uma atribuicao, ocorre uma

amarracao entre variavel e valor.

>>> a = a+1

A ocorrencia de a a esquerda da atribuicao e uma

referencia ao objeto (L-value). Observe que tudo em

Python sao objetos, inclusive numeros. A ocorrencia de a

a direita da atribuicao (R-value) deve ser de-referenciada.

4 USANDO O INTERPRETADOR 32

15

X

Valor

Namespace

“Tipo do valor e nao tipo da variavel (nome)”.

4 USANDO O INTERPRETADOR 33

>>> x = 3

>>> y = 3

>>> print x==y # sim, pois tem o mesmo valor

1

>>> print x is y # sim, pois numeros iguais sempre s~ao o mesmo objeto

1

>>> x = [1,2]

>>> y = [1,2]

>>> print x==y # sim, pois s~ao iguais

1

>>> print x is y # n~ao, pois s~ao objetos (estruturas) diferentes

0

>>> x = y = [1,2]

>>> print x==y # sim, pois s~ao iguais

1

>>> print x is y # sim, pois s~ao o mesmo objeto (mesma estrutura)

1

4 USANDO O INTERPRETADOR 34

>>> x[0] = 10

>>> print x

[10,2]

>>> print y # [10,2] , pois s~ao o mesmo objeto

[10,2]

>>> x = y = 3

>>> x = 10

>>> print x

10

>>> print y # 3 (n~ao muda pois e outro objeto - n~ao estruturado)

3

4 USANDO O INTERPRETADOR 35

4.2 Usando o Interpretador - Modo Programado

4.2.1 Exemplo: Programa Ola, mundo

$ vi teste.py

<i>

#!/usr/bin/python

print "Ola, mundo!"

<esc>

:wq

$ python teste.py

Ola, mundo!

$ chmod a+x teste.py

$ ./teste.py

Ola, mundo!

$

4 USANDO O INTERPRETADOR 36

4.2.2 Editando os Programas

vi E encontrado em qualquer sistema Unix; reconhece programasPython e fornece alguma ajuda atraves de cores nos comandos;

4 USANDO O INTERPRETADOR 37

4 USANDO O INTERPRETADOR 38

emacs Editor encontrado em qualquer instalacao Linux; reconheceprogramas Python e permite executar o programa dentro doproprio editor.

4 USANDO O INTERPRETADOR 39

5 PROGRAMACAO BASICA PYTHON 40

5 Programacao Basica Python

5.1 Identificadores

Exemplos: x, a10, carlos campani

Observacao: x 6= X

5 PROGRAMACAO BASICA PYTHON 41

5.2 Numeros

Decimal: 15

Hexadecimal: 0x1f

Octal: 020

Inteiro longo: 15L, 0x1fL, 020L

Ponto flutuante: 327.2, 0., .33333, 2.01e-10

Complexos: 3+2j

5 PROGRAMACAO BASICA PYTHON 42

>>> a = 3+2j

>>> b = complex(1,0)

>>> print a+b

(4+2j)

>>> a.real

3.0

>>> a.imag

2.0

>>>

5 PROGRAMACAO BASICA PYTHON 43

5.3 Strings

>>> print ’ola’

ola

>>> print "’Machado de Assis’ e o nome de um grande escritor"

’Machado de Assis’ e o nome de um grande escritor

>>> print ’"Erico Verıssimo" e o nome de um grande escritor’

"Erico Verıssimo" e o nome de um grande escritor

>>> print "Eis uma aspa: \"."

Eis uma aspa: ".

>>> frase = "Esta e a primeira linha.\nE esta e a segunda!"

>>> print frase

Esta e a primeira linha.

E esta e a segunda!

>>>

5 PROGRAMACAO BASICA PYTHON 44

Caracteres de escape:

Escape Significado

\" aspas

\n nova linha

\<XXX> ASCII caracter octal

\x<XXX> ASCII caracter hexadecimal

\u<XXXX> Unicode

5 PROGRAMACAO BASICA PYTHON 45

Para nao considerar os caracteres de escape use “r” antes da string:

>>> print "Primeiro\nSegundo"

Primeiro

Segundo

>>> print r"Primeiro\nSegundo"

Primeiro\nSegundo

Suporte ao padrao Unicode:

>>> print u"Ola, mundo!"

Ola, mundo!

5 PROGRAMACAO BASICA PYTHON 46

Algumas operacoes sobre strings:

>>> print "Ola, "+"mundo" # concatenac~ao

Ola, mundo

>>> print "Python"*2 # repetic~ao

PythonPython

>>> print "Python"[0] # indexac~ao

P

>>> print "Python"[-2] # indexac~ao para tras

o

>>> print "Python"[1:4] # particionar

yth

5 PROGRAMACAO BASICA PYTHON 47

5.4 Operadores

• Operadores aritmeticos:

Operador Descricao

+ adicao

- subtracao

* multiplicacao

/ divisao

% resto da divisao

** exponenciacao

x = x+y pode ser substituido por x += y. Isto

funciona para todos os operadores aritmeticos.

5 PROGRAMACAO BASICA PYTHON 48

• Operadores logicos:

Operador Descricao

and e logico

or ou logico

not negacao

Sao considerados valores falsos em Python: None, 0,

0.0, () ou [] (sequencia vazia) e {} (dicionario

vazio). Todo o resto e considerado verdadeiro.

5 PROGRAMACAO BASICA PYTHON 49

• Comparacoes:

Operador Descricao

> maior

< menor

== igual

>= maior ou igual

<= menor ou igual

<> ou != diferente

is mesmo objeto

in esta contido

5 PROGRAMACAO BASICA PYTHON 50

>>> if ’a’ in [’a’,’b’,’c’]:

... print "contido"

...

contido

5 PROGRAMACAO BASICA PYTHON 51

• Operadores de bits:

Operador Descricao

| ou

^ ou exclusivo

& e

<< desloca para a esquerda

>> desloca para a direita

~ negacao

5 PROGRAMACAO BASICA PYTHON 52

Exemplos:

>>> 3 | 4

7

>>> 3 & 4

0

>>> 4 << 1

8

>>> 4 << 2

16

>>> ~3

-4

5 PROGRAMACAO BASICA PYTHON 53

5.5 Sequencias e Dicionarios

• Sequencias: strings, tuplas e listas;

Exemplos:

– Tupla: (1,2,3);

Observacao: () e a tupla vazia e (1,) e uma

tupla com um elemento.

– Lista: [1,2,3];

Observacao: [] e a lista vazia.

5 PROGRAMACAO BASICA PYTHON 54

Operacoes com sequencias:

Operador Descricao

x in s pertinencia

x not in s nao pertinencia

s1 + s2 concatenacao

s*n s concatenado n vezes

s[i] indexacao

s[i:j] particionar

len(s) tamanho da sequencia

min(s) e max(s) menor e maior valor

5 PROGRAMACAO BASICA PYTHON 55

Exemplos:

>>> x = (10,30,20)

>>> print len(x)

3

>>> print max(x)

30

>>> print min(x)

10

>>> print x[0:2]

(10,30)

>>> x = [1,2,3]

>>> print x[0:2]

[1,2]

5 PROGRAMACAO BASICA PYTHON 56

No particionamento os valores default sao o primeiro

elemento e o ultimo respectivamente, de forma que

a[:] e uma particao identica a lista original (foi feita

apenas uma copia).

>>> a = b = [1,2,3]

>>> c = a[:]

>>> a[0] = 15

>>> a

[15,2,3]

>>> b

[15,2,3]

>>> c

[1,2,3]

5 PROGRAMACAO BASICA PYTHON 57

Operacoes com listas:

Operador Descricao

s[i]=x e s1[i:j]=s2 substituicao

del s[i:j] remove elementos

s.append(x) adiciona elemento

s1.extend(s2) adiciona lista

s.count(x) conta numero de ocorrencias

s.index(x) menor ındice de x

5 PROGRAMACAO BASICA PYTHON 58

Operacoes com listas (continuacao)

s.insert(i,x) insere na posicao i

s.pop(i) ou s.pop() retira elemento (default=−1)

s.remove(x) remove elemento x

s.reverse() reverte a lista

s.sort() ordena lista

5 PROGRAMACAO BASICA PYTHON 59

Usando listas como pilhas (ultimo a entrar e o

primeiro a sair):

>>> pilha = [1,2,3]

>>> pilha.append(4)

>>> pilha

[1,2,3,4]

>>> pilha.pop()

4

>>> pilha.pop()

3

>>> pilha

[1,2]

5 PROGRAMACAO BASICA PYTHON 60

Usando listas como filas (o primeiro a entrar e o

primeiro a sair):

>>> fila = [1,2,3]

>>> fila.append(4)

>>> fila

[1,2,3,4]

>>> fila.pop(0)

1

>>> fila.pop(0)

2

>>> fila

[3,4]

5 PROGRAMACAO BASICA PYTHON 61

Implementando CAR e CDR:

>>> s=[1,2,3]

>>> s[0] # CAR

1

>>> s[1:] # CDR

[2,3]

5 PROGRAMACAO BASICA PYTHON 62

• Dicionarios: Sao conjuntos de pares chave-valor;

Exemplos:

>>> x={’Carlos’ : ’15-11-1962’,\

’Fantomas’ : ’15-11-1960’}

>>> x[’Carlos’]

’15-11-1962’

5 PROGRAMACAO BASICA PYTHON 63

Operacoes com dicionarios:

len(d) tamanho do dicionario

d[k] valor da chave k

d[k]=x atribuicao

del d[k] remove par chave-valor

d.clear() apaga todos os elementos

d.copy() retorna copia do dicionario

d.has_key(k) verdadeiro se a chave existe

d.items() retorna lista de todos os elementos

5 PROGRAMACAO BASICA PYTHON 64

Operacoes com dicionarios (continuacao)

d.keys() lista de todas as chaves

d1.update(d2) atualiza todas as chaves

d.values() lista de todos os valores

5 PROGRAMACAO BASICA PYTHON 65

Exemplo:

>>> x[’Fantomas’] = ’10-11-1960’

>>> x.items()

[(’Carlos’,’15-11-1962’),(’Fantomas’,

’10-11-1960’)]

>>> x.has_key(’Carlos’)

1

5 PROGRAMACAO BASICA PYTHON 66

5.6 Algumas Funcoes Uteis

abs(n) Valor absoluto;

apply(funcao,args) Chama uma funcao com seus

argumentos;

Exemplo:

>>> def soma(x,y):

... return x+y

...

>>> apply(soma,[3,4])

7

complex(r,i) Cria um numero complexo;

5 PROGRAMACAO BASICA PYTHON 67

eval(e) Avalia uma expressao;

Exemplo:

>>> eval("10+5")

15

float(x) Converte string ou inteiro em ponto flutuante;

int(x) Converte para inteiro;

len(s) Retorna o tamanho de um objeto;

5 PROGRAMACAO BASICA PYTHON 68

list(s) Retorna uma lista contendo os elementos de uma

sequencia;

Exemplo:

>>> list("abc")

[’a’,’b’,’c’]

>>> list((1,2,3))

[1,2,3]

long(x) Converte para inteiro longo;

pow(x,y) Calcula xy;

5 PROGRAMACAO BASICA PYTHON 69

range Retorna uma lista contendo uma sequencia de

numeros;

Exemplo:

>>> range(1,6)

[1,2,3,4,5]

>>> range(0,4)

[0,1,2,3]

>>> range(2,11,2)

[2,4,6,8,10]

>>> range(10,5,-1)

[10,9,8,7,6]

5 PROGRAMACAO BASICA PYTHON 70

raw input(s) Leitura da entrada padrao (nao formata);

Exemplo:

>>> x = raw_input("x=")

x=15

>>> print x

15

>>> y = raw_input()

2003

>>> print y

2003

5 PROGRAMACAO BASICA PYTHON 71

str(x) Converte para string;

tuple(s) Converte uma sequencia para uma tupla;

Exemplo:

>>> tuple("abc")

(’a’,’b’,’c’)

5 PROGRAMACAO BASICA PYTHON 72

5.7 Estruturas de Controle

5.7.1 if

if x>0: print "maior que zero"

5 PROGRAMACAO BASICA PYTHON 73

if a>b:

print a

else:

print b

Observe endentacao (com brancos ou tabulacoes, mas

sempre coerente).

5 PROGRAMACAO BASICA PYTHON 74

Substitui o case/switch.

if x<0:

print "negativo"

elif x==0:

print "zero"

else:

print "positivo"

Permite quantos elif forem necessarios.

5 PROGRAMACAO BASICA PYTHON 75

5.7.2 while

Exemplo (fatorial):

n,fat = 5,1

while n>1:

fat = n*fat

n -= 1

print fat

Exemplo (Fibonacci):

a,b = 0,1

while b<15:

print b

a,b = b,a+b

5 PROGRAMACAO BASICA PYTHON 76

5.7.3 for

>>> for i in [1,2,3,4,5]:

... print i

...

1

2

3

4

5

>>>

5 PROGRAMACAO BASICA PYTHON 77

>>> for i in range(1,6):

... print i

...

1

2

3

4

5

>>>

5 PROGRAMACAO BASICA PYTHON 78

>>> for i in [’Ticiano’,’Jo~ao Vitor’,’Luana’]:

... print i

...

Ticiano

Jo~ao Vitor

Luana

5 PROGRAMACAO BASICA PYTHON 79

Muitas vezes e necessario modificar a lista que esta sendo

usada no laco for, o que e perigoso pois pode fazer o laco

perder-se. Nestes casos usa-se uma copia obtida por

particionamento.

Exemplo (apagar todos os elementos da lista com

tamanho maior que 10):

>>> s = [’Carlos Campani’,’Marcia’,’Luana’]

>>> for i in s[:]:

... if len(i)>10:

... s.remove(i)

...

>>> print s

[’Marcia’,’Luana’]

5 PROGRAMACAO BASICA PYTHON 80

Exemplo (selecao direta):

for i in range(0,len(v)):

ind=v[i:].index(min(v[i:]))

v[i],v[ind+i]=v[ind+i],v[i]

5 PROGRAMACAO BASICA PYTHON 81

Usando lista para construir uma matriz 3× 3:

>>> m = []

>>> for ind in range(0,9):

... m.append(ind*2)

...

>>> m

[0, 2, 4, 6, 8, 10, 12, 14, 16]

>>> i,j = 2,3

>>> m[(i-1)*3+j-1] = 7 # matriz[2,3] = 7

>>> m

[0, 2, 4, 6, 8, 7, 12, 14, 16]

5 PROGRAMACAO BASICA PYTHON 82

5.7.4 break

Interrompe o laco mais interior.

Exemplo:

achou = 0

for i in s:

if i == x:

achou = 1

break

5 PROGRAMACAO BASICA PYTHON 83

5.7.5 continue

Reinicia o laco.

Exemplo:

for i in s[:]:

if len(i) <= 10:

continue

else:

s.remove(i)

5 PROGRAMACAO BASICA PYTHON 84

5.7.6 else

O else de um laco e executado quando o laco termina

normalmente (nao pela ocorrencia de um break).

5.7.7 pass

while 1: # espera por Control-C

pass

5 PROGRAMACAO BASICA PYTHON 85

5.8 Tratamento de Excessoes

try: trata erros de execucao.

try:

bloco

except:

bloco

try:

bloco

except erro:

bloco

Erros: ZeroDivisionError, NameError, TypeError, etc.

5 PROGRAMACAO BASICA PYTHON 86

Exemplo:

x = 0

try:

y=1/x

except ZeroDivisionError:

print "erro"

5 PROGRAMACAO BASICA PYTHON 87

Observacao: except pode receber mais de um erro

(identificadores de erros separados por vırgulas).

5 PROGRAMACAO BASICA PYTHON 88

5.9 Funcoes

def fat(x):

if x<2:

return 1

else:

return x*fat(x-1)

>>> print fat(5)

120

5 PROGRAMACAO BASICA PYTHON 89

def fat(x):

if x:

return x*fat(x-1)

else:

return 1

Observe a utilidade do valor-verdade falso poder ser 0.

5 PROGRAMACAO BASICA PYTHON 90

def count(s): # retorna tamanho da sequencia

if s:

return count(s[1:])+1

else:

return 0

Observe a utilidade do valor-verdade falso poder ser [],

() ou "": podemos usar esta funcao com lista, tupla ou

string.

5 PROGRAMACAO BASICA PYTHON 91

Em Python nao existem procedimentos, so funcoes. Se a

funcao nao retorna nada nao e necessario void.

def ola():

print "Ola, mundo"

>>> ola()

Ola, mundo

5 PROGRAMACAO BASICA PYTHON 92

Para declarar uma variavel como global use a declaracao

global.

Exemplo:

def teste():

global x

x = 15

5 PROGRAMACAO BASICA PYTHON 93

Podemos definir valores default para os argumentos de

uma funcao:

>>> def teste(x,y=10,z=’Python’):

... print x,y,z

...

>>> teste(15)

15 10 Python

>>> teste(15,15,’Monty Python’)

15 15 Monty Python

>>> teste(1,’A Vida de Brian’,’Monty Python’)

1 A Vida de Brian Monty Python

5 PROGRAMACAO BASICA PYTHON 94

Valores default sao avaliados dentro do escopo de

definicao e nao dinamicamente:

>>> i = 15

>>> def teste(a=i):

... print a

...

>>> i = 10

>>> teste()

15

5 PROGRAMACAO BASICA PYTHON 95

Podemos definir funcoes com um numero arbitrario de

argumentos (argumentos excedentes serao transformados

em uma tupla):

def fprintf(f,formato,*args):

f.write(formato % args)

5 PROGRAMACAO BASICA PYTHON 96

Passagem de Parametros:

• E o casamento entre parametros reais e parametros

formais;

• Tipos de Passagem de Parametros:

– Tipo Entrada. Ex: PASCAL (Passagem por Valor

– padrao);

– Tipo Entrada-Saıda. Ex: PASCAL (Passagem por

Referencia – VAR);

– Tipo Saıda (raro). Ex: Passagem por Resultado;

– Em Python todos os argumentos sao passados por

referencia a objeto (copia da referencia).

5 PROGRAMACAO BASICA PYTHON 97

Para declarar funcoes anonimas, Python usa notacao

lambda:

>>> f = lambda x,y : x+y

>>> print f(10,15)

25

5 PROGRAMACAO BASICA PYTHON 98

Para documentar as funcoes use strings de documentacao.

def ola():

" Esta func~ao e um exemplo "

pass

5 PROGRAMACAO BASICA PYTHON 99

5.10 Programacao Funcional

Listas+CAR+CDR+Funcoes Anonimas=Programacao

Funcional

5 PROGRAMACAO BASICA PYTHON 100

5.11 Manipulacao de Arquivos

• Abrir arquivo com f = open(nome,modo) (modo

pode ser “r”, “w” ou “r+”; f e um descritor);

• Ler arquivo com f.read();

• Escrever no arquivo com f.write(string);

• Flush: f.flush();

• Fechar arquivo com f.close().

5 PROGRAMACAO BASICA PYTHON 101

Exemplo:

>>> f = open("teste.txt","r")

>>> x = f.read()

>>> f.close()

5 PROGRAMACAO BASICA PYTHON 102

5.12 Alguns Modulos do Python

• Extendem as capacidades do interpretador;

• Organizam o namespace;

• Podemos definir novos modulos em C ou Python, ou

importar modulos feitos por outros.

5 PROGRAMACAO BASICA PYTHON 103

sys Acesso as funcoes do sistema;

Exemplo:

#!/usr/bin/python

import sys

print sys.argv

$ ./teste.py a b c

[’teste.py’,’a’,’b’,’c’]

5 PROGRAMACAO BASICA PYTHON 104

pickle Conversao de objetos em stream bytes (permite

salvar em arquivo qualquer objeto Python);

>>> import pickle

>>> f = open("teste.pick","w")

>>> pickle.dump(("ola",[1,2,3]),f)

>>> f.close()

>>> f = open("teste.pick","r")

>>> print pickle.load(f)

(’ola’,[1,2,3])

>>> f.close()

>>>

5 PROGRAMACAO BASICA PYTHON 105

string Tratamento de strings;

>>> import string

>>> string.atoi("15")

15

>>> string.strip(" Como vai? ")

’Como vai?’

>>>

5 PROGRAMACAO BASICA PYTHON 106

re Trata expressoes regulares;

math Funcoes matematicas;

>>> import math

>>> print math.sin(.5)

0.479425538604

random Geracao de numeros aleatorios;

Exemplo:

>>> import random

>>> print random.random()

0.466429115742

5 PROGRAMACAO BASICA PYTHON 107

calendar Calendario perpetuo;

Exemplo:

>>> import calendar

>>> print calendar.month(2003,2)

February 2003

Mo Tu We Th Fr Sa Su

1 2

3 4 5 6 7 8 9

10 11 12 13 14 15 16

17 18 19 20 21 22 23

24 25 26 27 28

5 PROGRAMACAO BASICA PYTHON 108

os Relacionado ao sistema operacional;

Exemplo:

>>> import os

>>> os.system("ls -l")

total 3

drwxrwxr-x 2 carlos carlos 4096 Aug 25 20:39 Mail

drwxrwxr-x 2 carlos carlos 4096 Feb 17 11:56 docs

drwxrwxr-x 2 carlos carlos 4096 Feb 17 21:46 tmp

0

>>>

5 PROGRAMACAO BASICA PYTHON 109

os.path Trata caminhos de diretorios;

Exemplo:

>>> import os.path

>>> print os.path.abspath(".")

/home/carlos

Tkinter Acesso ao Tk;

signal Interceptacao de eventos assıncronos;

sockets Interface de rede;

thread Criacao de threads;

5 PROGRAMACAO BASICA PYTHON 110

gzip Compressao e descompressao gzip;

readline GNU readline;

zipfile Manuseio de arquivos zip.

5 PROGRAMACAO BASICA PYTHON 111

5.13 Pydoc

Completa documentacao dos modulos do Python ao

estilo das man pages do Unix.

$ pydoc sys

6 PROGRAMACAO ORIENTADA A OBJETOS 112

6 Programacao Orientada a

Objetos

6.1 Conceitos Basicos

• A POO surgiu na area de simulacao de sistemas e

interfaces graficas;

• Simula e Smalltalk;

• Facilita a programacao ao fornecer um mecanismo de

abstracao de dados que estimula o reuso de codigo e

disciplina os programadores a usar de forma correta o

codigo que sera reusado.

6 PROGRAMACAO ORIENTADA A OBJETOS 113

Objeto Uma unidade contendo dados e metodos para

manipular estes dados;

Classe Um molde para criacao de objetos;

Encapsulamento Os dados e metodos que manipulam

estes dados estao definidos dentro de uma unidade de

codigo que esconde os detalhes de implementacao

(abstracao), permitindo que o programador acesse o

codigo atraves de uma interface publica (ao contrario

da implementacao que e privada);

Heranca Permite o reuso de codigo atraves de um

mecanismo de classes e subclasses que sao herdadas

das primeiras, criando uma hierarquia;

6 PROGRAMACAO ORIENTADA A OBJETOS 114

Mensagens As chamadas aos metodos sao entendidas

como envio de mensagens para os objetos (toda a

computacao de um programa e entendida como uma

sequencia de mensagens enviadas de objeto para

objeto);

Polimorfismo Cada operador, entendido como uma

mensagem enviada a seus operandos reage segundo o

contexto (o objeto que esta sendo usado);

Instanciacao Criar um objeto a partir de uma classe.

6 PROGRAMACAO ORIENTADA A OBJETOS 115

6.2 Programacao Orientada a Objetos em Python

• Definindo classes em Python

Sem heranca:

class nome:

bloco

Heranca simples:

class nome(classe-pai):

bloco

Heranca multipla (quando existe mais de uma classe-pai):

class nome(classe-pai-1,classe-pai-2,...):

bloco

• Definindo metodos da classe: usa-se def.

• Em Python, podemos documentar as classes usando strings de

documentacao.

6 PROGRAMACAO ORIENTADA A OBJETOS 116

• Exemplo:

class atomo:

def __init__(self,numat,x,y,z):

self.numat = numat

self.pos = (x,y,z)

def simbolo(self):

return TabSimbAt[self.numat]

def __repr__(self):

return "NumAtom=%d X=%d Y=%d Z=%d"%(self.numat,\

self.pos[0],self.pos[1],self.pos[2])

• Observacoes:

– self e o proprio objeto;

– init e o contrutor da classe;

– repr e a rotina de impressao.

6 PROGRAMACAO ORIENTADA A OBJETOS 117

• Instanciando:

>>> atomo = atomo(2,0,1,0)

>>> print atomo

NumAtom=2 X=0 Y=1 Z=0

>>> print atomo.simbolo()

He

>>>

6 PROGRAMACAO ORIENTADA A OBJETOS 118

• Polimorfismo:

>>> class A:

... def get(self):

... print "Ola, mundo"

...

>>> class B:

... def get(self):

... print "Python"

...

>>> a = A()

>>> b = B()

>>> a.get()

Ola, mundo

>>> b.get()

Python

a e b sao objetos diferentes e a mensagem .get() reage de forma diferente

em cada um.

6 PROGRAMACAO ORIENTADA A OBJETOS 119

• Observacao: tudo que tiver na frente e privado;

class esconde:

def __init__(self,x,y):

self.__x = x # x e privado

self.y = y # y e publico

def impx(self):

print self.__x

>>> e = esconde(10,15)

>>> print e.y

15

>>> e.impx()

10

• Metodo privado:

class teste:

def __secreto(self): # metodo privado

...

6 PROGRAMACAO ORIENTADA A OBJETOS 120

• Definindo a classe molecula:

class molecula:

def __init__(self,nome="desconhecida"):

self.nome = nome

self.listadeatomos = []

def adicatomo(self,atomo):

self.listadeatomos.append(atomo)

def __repr__(self):

s = ""

for a in self.listadeatomos:

s = s+"%s\n"%a

return "Nome=%s\nLista de atomos=\n%s"%(self.nome,s)

• Instanciando H2:

>>> hidro1 = atomo(1,0,0,0)

>>> hidro2 = atomo(1,1,0,0)

>>> h2 = molecula("Molecula de Hidrogenio (H2)")

>>> h2.adicatomo(hidro1)

>>> h2.adicatomo(hidro2)

6 PROGRAMACAO ORIENTADA A OBJETOS 121

• Herdando uma classe:

class substancia(molecula):

def __init__(self,nome,propriedades):

molecula.__init__(self,nome)

self.propriedades = propriedades

def adicatomo(self,atomo):

molecula.adicatomo(self,atomo)

def __repr__(self):

return "Molecula %s\nPropriedades=%s"%(self.nome,\

self.propriedades)

• Observacoes:

– class substancia(molecula): indica que substancia esta sendo herdada

de molecula (molecula e a superclasse, substancia e a subclasse);

– molecula. init (self,nome) significa a chamada do metodo construtor

pai;

– Ja repr foi totalmente reescrito.

6 PROGRAMACAO ORIENTADA A OBJETOS 122

• Atributo de classe e de instancia:

class teste:

x = 10 # atributo global (de classe)

def __init__(self,n):

self.y = n # atributo de instancia

...

6 PROGRAMACAO ORIENTADA A OBJETOS 123

• Outro exemplo de heranca:

class Alimento:

def __init__(self,nome,quantidade):

self.nome=nome

self.quantidade=quantidade

def __repr__(self):

return "Nome=%s\nQuantidade=%s"%(self.nome,\

self.quantidade)

class Leite(Alimento):

def __init__(self,nome,quantidade,lipideos):

Alimento.__init__(self,nome,quantidade)

self.lipideos=lipideos

class Sucrilhos(Alimento):

def __init__(self,nome,quantidade):

Alimento.__init__(self,nome,quantidade)

self.vitaminas=[]

def adicvitamina(self,vitamina,quantidade):

self.vitaminas.append((vitamina,quantidade))

6 PROGRAMACAO ORIENTADA A OBJETOS 124

Alimento

yyssssssssss

&&NNNNNNNNNNN

Leite Sucrilhos

7 PYTHON AVANCADO 125

7 Python Avancado

7.1 Modulo Gnuplot - Programacao

Cientıfica

• Modulo para acessar o programa externo gnuplot;

• Home page: http://gnuplot-py.sourceforge.net.

7 PYTHON AVANCADO 126

import Gnuplot,math

x=[]

i=0.0

while i<2*math.pi:

x.append([i,math.sin(i)])

i+=0.005

g=Gnuplot.Gnuplot()

g.title("Seno")

g.xlabel("X")

g.ylabel("SEN(X)")

g.plot(x)

raw_input("pressione enter")

7 PYTHON AVANCADO 127

7 PYTHON AVANCADO 128

import Gnuplot,math

x=[]

y=[]

i=0.0

while i<2*math.pi:

x.append([i,math.sin(i)])

y.append([i,math.cos(i)])

i+=0.005

g=Gnuplot.Gnuplot()

g.title("Seno/Cosseno")

g.xlabel("X")

g.ylabel("SEN(X)/COS(X)")

g.plot(x,y)

raw_input("pressione enter")

7 PYTHON AVANCADO 129

7 PYTHON AVANCADO 130

7.2 Numerical Python - Programacao

Cientıfica

• Inclui muitos recursos do Matlab, mas ao contrario

deste e software livre;

• Multiplataforma;

• Manipulacao de matrizes e algebra linear:

determinante, inversao de matriz, matriz transposta,

multiplicacao de matrizes, solucao de sistemas

lineares, autovalores e autovetores, etc.

• Home page:

http://sourceforge.net/projects/numpy.

7 PYTHON AVANCADO 131

Vetores, matrizes, shape e reshape:

>>> from Numeric import *

>>> from LinearAlgebra import *

>>> a = arrayrange(0,2*pi,0.1)

>>> print a

[0.,0.1,0.2, ... 6.2]

>>> sin(a)

[0., 0.09983342, ... -0.0830894]

>>> a = zero((3,3),Float)

>>> print a

[[0.,0.,0.],

[0.,0.,0.],

[0.,0.,0.]]

7 PYTHON AVANCADO 132

>>> print a.shape

(3,3)

>>> reshape(a,(9,))

>>> print a

[0.,0.,0.,0.,0.,0.,0.,0.,0.]

7 PYTHON AVANCADO 133

Determinante:

>>> a = ones((2,2),Float)

>>> a = a*10

>>> print a

[[10.,10.],

[10.,10.]]

>>> print determinant(a)

0.0

7 PYTHON AVANCADO 134

Autovalores, autovetores e diagonalizacao:

>>> a = array([0,1,.5,.5])

>>> print a

[0 1 .5 .5]

>>> a = reshape(a,(2,2))

>>> print a

[[ 0. 1.]

[ .5 .5]]

>>> val,vet = eigenvectors(a)

>>> vet = transpose(vet)

>>> q1 = inverse(vet)

>>> dia = identity(n)*val

>>> print vet

7 PYTHON AVANCADO 135

[[ 0.70710678 -0.89442719]

[ 0.70710678 0.4472136 ]]

>>> print q1

[[ 0.47140452 0.94280904]

[-0.74535599 0.74535599]]

>>> print dia

[[ 1. -0. ]

[ 0. -0.5]]

7 PYTHON AVANCADO 136

Multiplicacao de matrizes:

>>> x = matrixmultiply(matrixmultiply(vet,dia),q1)

>>> print x

[[ -6.93618340e-17 1.00000000e-00]

[ 5.00000000e-01 5.00000000e-01]]

7 PYTHON AVANCADO 137

7.3 Internacionalizacao

• Modulo gettext;

• Acesso a API GNU-gettext;

• Permite que as mensagens do aplicativo sejam

escritas em diversas lınguas, de forma que o usuario

possa escolher a lıngua que deseja.

7 PYTHON AVANCADO 138

7.4 Extendendo Python usando C e

C++

• Escrevendo modulos em C ou C++;

• Partes do programa C:

1. Definicao das funcoes C;

2. Tabela de metodos;

3. Funcao de inicializacao.

• Todos os objetos Python tem py_ na frente;

• PyArg Parse traduz de Python para C;

• Py BuildValue traduz de C para Python.

7 PYTHON AVANCADO 139

Exemplo:

#include "Python.h"

static PyObject *py_soma(PyObject *self,

PyObject *args) {

double a,b,c;

PyArg_ParseTuple(args,"dd",&a,&b);

c=a+b;

return Py_BuildValue("d",c);

}

static PyMethodDef Somalib_methods[]={

{"soma",py_soma,METH_VARARGS},

{NULL,NULL}

};

7 PYTHON AVANCADO 140

void initSomalib() {

(void) Py_InitModule("Somalib",

Somalib_methods);

}

7 PYTHON AVANCADO 141

Como compilar:

cc -I/usr/include/python2.1 -c Somalib.c

cc -shared Somalib.o -o Somalib.so

7 PYTHON AVANCADO 142

Como Python encontra os modulos?

• PYTHONPATH;

• Diretorio corrente;

• /usr/lib/python2.1/site-packages.

7 PYTHON AVANCADO 143

Como usar:

>>> import Somalib

>>> Somalib.soma(10,20)

30

ou

>>> from Somalib import *

>>> soma(10,20)

30

7 PYTHON AVANCADO 144

Outro exemplo:

#include "Python.h"

static PyObject *py_Imprime(PyObject *self,

PyObject *args) {

char *str;

PyArg_ParseTuple(args,"s",&str);

printf("%s\n",str);

Py_INCREF(Py_None);

return Py_None;

}

7 PYTHON AVANCADO 145

static PyObject *py_Tamanho(PyObject *self,

PyObject *args) {

char *str;

int t;

PyArg_ParseTuple(args,"s",&str);

t=0;

while (str[t]!=0)

t++;

return Py_BuildValue("i",t);

}

7 PYTHON AVANCADO 146

static PyMethodDef TrataString_methods[]={

{"Tamanho",py_Tamanho,METH_VARARGS},

{"Imprime",py_Imprime,METH_VARARGS},

{NULL,NULL}

};

void initTrataString() {

(void) Py_InitModule("TrataString",

TrataString_methods);

}

7 PYTHON AVANCADO 147

Para retornar None:

Py_INCREF(Py_None)

return Py_None

7 PYTHON AVANCADO 148

7.5 Comunicacao com Programas em

Outras Linguagens (C, FORTRAN,

LISP, PROLOG, etc.)

• Todo programa pode comunicar-se com Python pelo

dispositivo de entrada/saıda padrao;

• Usa-se popen ou popen2 para abrir um pipe com o

programa.

7 PYTHON AVANCADO 149

#include "stdio.h"

main()

{

int x;

scanf("%d",&x);

printf("%d",x*2);

}

$ gcc -o teste.o teste.c

7 PYTHON AVANCADO 150

>>> import os

>>> f = os.popen("./teste.o","w")

>>> f.write("15")

>>> f.flush()

>>> f.close()

7 PYTHON AVANCADO 151

7.6 Profiling

Permite determinar que partes do programa sao

“gargalos” de tempo e devem ser convertidas para C,

aumentando o desempenho do programa de forma mais

eficiente.

7 PYTHON AVANCADO 152

import random,profile

def escolhe():

global nums

nums = []

for i in range(1,51):

nums.append(int(100*random.random()+1))

def fat(n):

if n<2:

return 1.0

else:

return float(n*fat(n-1))

def main():

global nums

escolhe()

for i in range(0,50):

print nums[i],fat(nums[i])

profile.run(’main()’)

7 PYTHON AVANCADO 153

...

2253 function calls (104 primitive calls) in 0.140 CPU seconds

Ordered by: standard name

ncalls tottime percall cumtime percall filename:lineno(function)

1 0.000 0.000 0.100 0.100 <string>:1(?)

1 0.040 0.040 0.140 0.140 profile:0(main())

0 0.000 0.000 profile:0(profiler)

50 0.000 0.000 0.000 0.000 random.py:154(random)

1 0.010 0.010 0.100 0.100 teste.py:12(main)

1 0.000 0.000 0.000 0.000 teste.py:2(escolhe)

2199/50 0.090 0.000 0.090 0.002 teste.py:7(fat)

7 PYTHON AVANCADO 154

7.7 Python e OpenGL

• OpenGL permite criar graficos 3D (adiciona depth as

coordenadas de um ponto) e efetuar transformacoes

de imagem (rotacao, translacao, etc.) - home pages:

http://www.opengl.org e

http://pyopengl.sourceforge.net;

• Placas graficas aceleram as transformacoes;

• Criado pela Silicon Graphics (como padrao aberto);

Amado pelos produtores de jogos: Quake, Diablo,

etc.

• Implementacao livre: Mesa3D ( home page:

http://www.mesa3d.org).

7 PYTHON AVANCADO 155

Famılia OpenGL:

GL Biblioteca basica (comandos primitivos);

GLU Utilitarios e comandos mais complexos (exemplo:

desenhar cilindro);

GLX GL para X-Window;

GLUT Caixa de ferramentas com recursos mais

sofisticados (exemplo: desenhar esfera);

7 PYTHON AVANCADO 156

7.7.1 Exemplo: Programa Esferas

from OpenGL.GL import *

from OpenGL.GLU import *

from OpenGL.GLUT import *

7 PYTHON AVANCADO 157

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH)

glutInitWindowSize(400,400)

glClearColor(0.,0.,0.,1.)

glutCreateWindow("Esferas")

glEnable(GL_LIGHTING)

lightZeroPosition = [-5.,2.,-5.,2.]

lightZeroColor = [.2,.5,.7,.5]

glLightfv(GL_LIGHT0,GL_POSITION,lightZeroPosition)

glLightfv(GL_LIGHT0,GL_DIFFUSE,lightZeroColor)

glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,0.5)

glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,0.03)

glEnable(GL_LIGHT0)

glutDisplayFunc(display)

glutMainLoop()

7 PYTHON AVANCADO 158

def display():

glColor3f(1.,1.,1.)

glTranslatef(0.,.25,-0.25)

glutSolidSphere(.6,100.,5.)

glTranslatef(-0.3,-0.6,.5)

glutSolidSphere(.4,100.,5.)

glutSwapBuffers()

7 PYTHON AVANCADO 159

7 PYTHON AVANCADO 160

7.8 PIL - Python Imaging Library

• Processamento de imagens;

• http://www.pythonware.com/products/pil/.

7 PYTHON AVANCADO 161

>>> import Image

>>> imagem = Image.open("darthmaul2.jpg")

>>> print imagem.format, imagem.size, imagem.mode

JPEG (1024, 768) RGB

>>> imagem.save("darth.gif")

7 PYTHON AVANCADO 162

7.9 Usando MySQL

• Modulo Python-MySQLdb;

• Voce precisa de acesso ao servidor MySQL (senha).

7 PYTHON AVANCADO 163

Banco de dados “meu”, tabela “animal”:

Nome Data de nascimento

Hamster 2003-01-01

Rintintin 1950-11-15

Acara 1994-11-15

7 PYTHON AVANCADO 164

>>> import MySQLdb

>>> con=MySQLdb.Connection(user="root",passwd=\

<senha>,db="meu")

>>> curs=con.cursor()

>>> curs.execute("select * from animal")

>>> print curs.fetchall()

((’Hamster’, ’2003-01-01’), (’Rintintin’,

’1950-11-15’), (’Acara’, ’1994-11-15’))

>>> curs.execute("select nome from animal where\

nascimento>19940101")

>>> print curs.fetchall()

((’Hamster’,), (’Acara’,))

>>> curs.execute("select nome from animal where\

nascimento>19940101 and nome<>’Acara’")

7 PYTHON AVANCADO 165

>>> print curs.fetchall()

((’Hamster’,),)

>>> curs.close()

>>> con.close()

7 PYTHON AVANCADO 166

7.10 Python como Linguagem de Cola

(Glue Language)

• Python consegue comunicar-se com outras

linguagens, acessa gnuplot, OpenGL, MySQL etc.

• Isto permite imaginar Python como uma “cola” entre

estes recursos;

• Podemos usar Python para acessar aquele pacote

grafico maravilhoso, que so funciona com C, em um

programa FORTRAN, ou entao desenhar uma

interface grafica usando Tk para um programa

PROLOG (que originalmente nao possui suporte

para Tk);

7 PYTHON AVANCADO 167

• Um modulo que permite Python comunicar-se com

outro programa e chamado de wrapper ;

• Podemos usar o swig (http://www.swig.org) para

fazer wrappers.

7 PYTHON AVANCADO 168

7.11 Scripts CGI

• Primeiro instalar o servidor Apache corretamente;

• Colocar os scripts no diretorio cgi-bin criado na

instalacao do servidor;

• Dar previlegio de execucao para o script;

• Dois tipos de forms: POST e GET.

7 PYTHON AVANCADO 169

7.11.1 Exemplo: Ola, mundo

#!/usr/bin/python

import cgi

print "Content-Type: text/html"

print

print "<TITLE>CGI teste</TITLE>"

print "<H1>Teste</H1>"

print "Ola, mundo!"

7 PYTHON AVANCADO 170

7.11.2 Exemplo: Formulario

<HTML>

<HEAD>

<TITLE>Teste</TITLE>

</HEAD>

<BODY>

<H1>Enquete</H1>

<P>

Sua preferencia de compra:<P>

<FORM action="http://localhost/cgi-bin/testecgi2.py" method="POST">

<SELECT Name="Prefere">

<OPTION Value="0">Selecione um</OPTION>

<OPTION Value="1">Carro</OPTION>

<OPTION Value="2">Casa</OPTION>

</SELECT>

<P>

Salario:<P>

<INPUT type="text" name="Valor" size="20">

</P>

7 PYTHON AVANCADO 171

Sexo:

<INPUT type="radio" name="Sexo" value="homem" checked>Homem

<INPUT type="radio" name="Sexo" value="mulher">Mulher</P>

<INPUT type="submit" value="Submeter" name="Botao">

</FORM>

</BODY>

</HTML>

7 PYTHON AVANCADO 172

#!/usr/bin/python

import cgi

print "Content-Type: text/html"

print

print "<TITLE>CGI teste</TITLE>"

form=cgi.FieldStorage()

Prefere=form.getvalue("Prefere")

Valor=form.getvalue("Valor")

Sexo=form.getvalue("Sexo")

if Prefere=="0":

Preferencia=""

elif Prefere=="1":

Preferencia="Carro"

else:

Preferencia="Casa"

print "Preferencia: %s<p>"%(Preferencia)

print "Valor: %s<p>"%(Valor)

print "Sexo: %s<p>"%(Sexo)

7 PYTHON AVANCADO 173

Curiosidade:

http://www.google.com

GOOGLE=Linux+Python+MySQL

7 PYTHON AVANCADO 174

7.12 Suporte a Som

Modulos sunau e wave.

import sunau

i=sunau.open("pequeno.au","r")

nchannels=i.getnchannels()

samplewidth=i.getsampwidth()

framerate=i.getframerate()

nframes=i.getnframes()

comptype=i.getcomptype()

compname=i.getcompname()

s=i.readframes(nframes)

i.close()

7 PYTHON AVANCADO 175

o=sunau.open("/dev/audio","w")

o.setnchannels(nchannels)

o.setsampwidth(samplewidth)

o.setframerate(framerate)

o.setnframes(nframes)

o.setcomptype(comptype,compname)

o.writeframes(s)

o.close()

7 PYTHON AVANCADO 176

7.13 Processamento de Audio -

Ecasound

Processamento de audio em Python/Linux.

http://www.eca.cx/ecasound/

8 PROGRAMACAO GRAFICA USANDO TK 177

8 Programacao Grafica usando

Tk

8.1 Introducao ao Tk

• Conjunto de widgets projetado por John K.

Ousterhout em 1987;

• Home page: http://www.tcl.tk.

• Tk = Tool kit (como uma biblioteca);

• Widget (“coisinha”) e um objeto de interface de

usuario grafica;

8 PROGRAMACAO GRAFICA USANDO TK 178

• Originalmente projetado para ser usado com Tcl

(Toolkit Control Language);

• Tcl e muito limitado como linguagem;

• Pode ser usada tambem com Perl e Python;

• Modulo Tkinter: interface Python-Tk - orientado a

objetos;

8 PROGRAMACAO GRAFICA USANDO TK 179

Como funcionam as chamadas do Tkinter?

Seu programa Python

²²Tkinter (Python)

²²tkinter (C)

²²Tk widgets (C e Tcl)

²²Tk (C)

²²Xlib

Problema: a necessidade de acessar Tcl.

8 PROGRAMACAO GRAFICA USANDO TK 180

8.2 Usando o Tkinter

• Tkinter e um wrapper para acessar Tk a partir de

Python;

• Um wrapper e como uma camada que faz a

comunicacao de duas outras.

Tk

Tkinter

Python

8 PROGRAMACAO GRAFICA USANDO TK 181

8.2.1 Alguns Widgets do Tk

Label Exibe texto nao formatado;

Button Botao (pode-se associar o clique do mouse com

um “callback”);

Frame Container retangular usado para colocar uma

hierarquia de widgets filhos (nao aparece na tela);

Text Texto formatado editavel;

Listbox Selecao de alternativas;

8 PROGRAMACAO GRAFICA USANDO TK 182

Canvas Exibe objetos graficos (e um container; pode ser

usado para criar widgets personalizados);

Checkbox Seleciona um valor booleano;

Entry Campo de preenchimento de texto;

Menu Permite criar os menus de um aplicativo;

Scrollbar Barra de rolagem.

8 PROGRAMACAO GRAFICA USANDO TK 183

8.2.2 Exemplo: Ola, mundo

from Tkinter import *

root = Tk()

lb = Label(root,text="Ola, mundo!")

lb.pack()

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 184

from Tkinter import *

root = Tk()

lb = Label(root,text="Ola, mundo!")

lb.pack()

root.mainloop()

Descricao:

root = Tk() root e o handler do widget raız (representa a aplicacao); Tk() e o

construtor da aplicacao;

Label observe que o construtor Label recebe o handler do root (widget

mestre); Label e o widget escravo;

text="texto" Opcao indicando o texto a ser exibido dentro do widget;

lb Armazena o handler do widget;

.pack() Metodo para “empacotar” um widget (exibe na tela);

root.mainloop() E o loop do aplicativo (trata todos os eventos).

8 PROGRAMACAO GRAFICA USANDO TK 185

8 PROGRAMACAO GRAFICA USANDO TK 186

8.2.3 Exemplo: Ola, mundo 2

from Tkinter import *

root = Tk()

Label(root,text="Ola, mundo!").pack()

root.mainloop()

Observe que nao e necessario armazenar o handler.

8 PROGRAMACAO GRAFICA USANDO TK 187

8.2.4 Widget Label: Algumas Opcoes

O construtor Label, assim como todos os outros metodos

construtores de widgets, recebe as opcoes na forma

chave = valor

8 PROGRAMACAO GRAFICA USANDO TK 188

anchor Indica onde o texto sera posicionado dentro do

widget; Default e CENTER; Outros valores sao N, E,

S, W, NE, NW, etc.

background (bg) Cor do fundo;

borderwidth (bd) Espessura da borda;

font Fonte usado no texto;

foreground (fg) Cor do texto exibido dentro do widget;

height Altura do widget em linhas de texto;

justify Alinhamento do texto: LEFT, CENTER (o

default), RIGHT;

8 PROGRAMACAO GRAFICA USANDO TK 189

padx Espaco extra a direita e a esquerda do widget (em

pixels);

pady Espaco extra acima e abaixo;

relief Aparencia do widget: FLAT (o default), RIDGE,

GROOVE, RAISED, e SUNKEN;

text O texto a ser exibido (nova linha com \n);

width Largura do widget.

8 PROGRAMACAO GRAFICA USANDO TK 190

8.2.5 Empacotamento

“Empacotar” significa colocar um widget em uma

aplicacao (determinar sua posicao em relacao aos outros

widgets).

8 PROGRAMACAO GRAFICA USANDO TK 191

1. Usando-se .pack() - Cria o layout empacotando

widgets dentro de widgets de forma hierarquica

(widgets mestre e escravo), tratando-os como blocos

retangulares;

Frame

Frame

Frame

8 PROGRAMACAO GRAFICA USANDO TK 192

Algumas opcoes:

anchor Posiciona ao empacotar: N, S, W, E, NE, etc.

fill Preenche espaco disponıvel: X, Y ou BOTH;

side Posiciona os widgets ao empacotar: LEFT (da

esquerda para a direita na ordem em que forem

empacotados), RIGHT, TOP, BOTTOM.

8 PROGRAMACAO GRAFICA USANDO TK 193

2. Usando-se .grid() - Permite criar layouts baseado em

uma grelha bidimensional (como uma tabela);

0

0 1

1

8 PROGRAMACAO GRAFICA USANDO TK 194

Algumas opcoes:

column Indica a coluna da grelha em que sera

posicionado o widget (comeca em 0);

columnspan Caso se queira que o widget ocupe mais

de uma coluna (junta celulas);

row Indica a linha da grelha (comeca em 0);

rowspan Junta linhas;

sticky Determina como o widget vai ocupar uma

celula da grelha: N, S, W, E, N+S (ocupa todo o

espaco horizontal), E+W (ocupa todo o espaco

vertical), N+E+S+W (preenche todo o espaco

disponıvel).

8 PROGRAMACAO GRAFICA USANDO TK 195

3. Usando-se .place() - Permite posicionar

explicitamente o widget;

8 PROGRAMACAO GRAFICA USANDO TK 196

Cuidado! Os empacotadores podem ser usados juntos em

uma aplicacao, mas nao em um mesmo frame.

8 PROGRAMACAO GRAFICA USANDO TK 197

8.2.6 Binding e Callback (Handler)

• “Binding” e um mecanismo geral para associar uma

acao particular do usuario (evento) com um

comportamento definido especıfico da aplicacao;

• “Callback” e a chamada do handler;

• “Handler” e a funcao/metodo que responde ao

evento.

8 PROGRAMACAO GRAFICA USANDO TK 198

8.2.7 Metodos Universais

• Sao aqueles que existem para todos os widgets;

• Exemplos:

.bind() Define bindings;

.clipboard append() Insere na clipboard do Tk;

.clipboard clear() Limpa a clipboard do Tk;

.configure() ou .config() Configura o widget

depois de criado;

.destroy() Destroi o widget;

8 PROGRAMACAO GRAFICA USANDO TK 199

.event add() Cria eventos virtuais;

.grab set() Captura todos os eventos da aplicacao;

.mainloop() Espera por eventos;

.quit() Abandona o “mainloop”.

8 PROGRAMACAO GRAFICA USANDO TK 200

8.2.8 Exemplo: Ola, mundo 3

from Tkinter import *

root = Tk()

root.title("Teste")

lb = Label(root,text="Ola, mundo!",width=20)

lb.pack()

root.mainloop()

Observacao: width e dado em unidades de texto.

8 PROGRAMACAO GRAFICA USANDO TK 201

8 PROGRAMACAO GRAFICA USANDO TK 202

8.2.9 Dimensoes e Sistema de Coordenadas

• Especificar as dimensoes em: c (centımetros), i

(polegadas), m (milimetros), p (pontos de impressao);

• Se nao especifica a dimensao, o valor e tomado como

pixels;

• O sistema de coordenadas e relativo ao canto

superior esquerdo da janela, “x” refere-se a distancias

na horizontal e “y” refere-se a distancias na vertical.

8 PROGRAMACAO GRAFICA USANDO TK 203

8.2.10 Exemplo: Ola, mundo 4

from Tkinter import *

root = Tk()

root.title("Teste")

b = Button(root,bg="blue",fg="yellow",text="Ola, mundo!",\

width=20,command=root.quit)

b.config(activebackground="yellow") # poderia ser feito na criac~ao

b.config(activeforeground="blue")

b.pack()

root.mainloop()

Observacoes:

• widget “Button” permite criar botoes clicaveis no aplicativo;

• “bg” e a cor de fundo e “fg” e a cor do texto;

• “command” define uma resposta ao evento “clicar no botao”;

• “.config” e o metodo para configurar widgets.

8 PROGRAMACAO GRAFICA USANDO TK 204

8 PROGRAMACAO GRAFICA USANDO TK 205

8.2.11 Widget Button

Principais opcoes:

activebackground Cor de fundo quando o mouse esta

sobre o widget;

activeforeground Cor do texto quando o mouse esta

sobre o widget;

anchor Identico a Label;

bd Espessura da borda;

command Resposta ao clique;

cursor Permite definir o cursor quando o mouse esta

sobre o widget;

8 PROGRAMACAO GRAFICA USANDO TK 206

justify Identico ao widget Label;

padx idem;

pady idem;

relief idem;

text Texto que vai aparecer no botao;

underline Indica a posicao do caracter que sera

sublinhado no texto do widget e servira de atalho do

botao (comeca com 0);

width Largura do botao.

8 PROGRAMACAO GRAFICA USANDO TK 207

8.2.12 Exemplo: Ola, mundo 5

from Tkinter import *

def callback():

print ("Ola, mundo!")

root = Tk()

root.title("Teste")

frame = Frame(root)

frame.pack()

b = Button(frame,text="Fala vivente",command=callback)

b2 = Button(frame,text="Tchau...",command=root.quit)

b.pack(side=LEFT)

b2.pack(side=LEFT)

root.mainloop()

• widget “Frame” e um “container” (nao aparece na tela);

• “command=callback” define um callback para o botao;

• “.pack(side=LEFT)” - packing com posicao.

8 PROGRAMACAO GRAFICA USANDO TK 208

8 PROGRAMACAO GRAFICA USANDO TK 209

8.2.13 Widget Frame

Algumas opcoes:

background (bg) Cor de fundo do frame;

borderwidth Espessura da borda (default e 0);

height Altura do frame;

relief Identico ao descrito em Label e Button;

width Largura do frame;

8 PROGRAMACAO GRAFICA USANDO TK 210

8.2.14 Exemplo: Ola, mundo 6

from Tkinter import *

def callback(evento): # note o argumento evento do callback

print ("Ola, mundo! x=%d y=%d"%(evento.x,evento.y))

root = Tk()

root.title("Teste")

frame = Frame(root)

frame.pack()

b = Button(frame,text="Clique duplo aqui")

b.bind("<Double-Button-1>",callback) # binding de eventos

b2 = Button(frame,text="Tchau...",command=root.quit)

b.pack(side=TOP) # observe que side=TOP

b2.pack(side=TOP,fill=X) # fill=X para ocupar todo o espaco

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 211

8 PROGRAMACAO GRAFICA USANDO TK 212

8.2.15 Mais Sobre Binding

• Alguns tipos de eventos:

Button O usuario pressionou um botao com o

mouse (exemplo: <Button-1> e o botao esquerdo

do mouse);

Configure O usuario mudou o tamanho do widget

(por exemplo, arrastando a borda da janela);

Enter O mouse entrou na area do widget;

Leave O mouse saiu da area do widget;

Motion O usuario esta arrastando o widget;

8 PROGRAMACAO GRAFICA USANDO TK 213

• Modificadores de evento:

Alt O usuario pressionou junto <Alt>;

Control Pressionou junto <Control>;

Double Dois eventos em sequencia (exemplo:

<Double-Button-1>);

8 PROGRAMACAO GRAFICA USANDO TK 214

• Nıveis de binding:

– Binding de instancia - binding de um evento com

um widget especıfico;

Exemplo: w.bind("<Button-1>",callback);

– Binding de classe - binding de todos os widgets da

classe;

Exemplo:

w.bind_class("Canvas","<Double-Button-2>",\

callback);

– Binding da aplicacao - binding de todos os widgets

da aplicacao;

Exemplo:

w.bind_all("<Button-2>",callback);

8 PROGRAMACAO GRAFICA USANDO TK 215

• Algumas informacoes que podem ser passadas para o

handler (callback) atraves do argumento evento:

.widget qual widget gerou o callback;

.x coordenada x do evento em relacao ao widget;

.y coordenada y do evento em relacao ao widget;

8 PROGRAMACAO GRAFICA USANDO TK 216

• Eventos virtuais:

w.event_add("<<Seleciona>>","Button-1",\

"Button-2")

w.bind("<<Seleciona>>",callback)

8 PROGRAMACAO GRAFICA USANDO TK 217

8.2.16 Exemplo: Ola, mundo 7

# usando orientac~ao a objetos

from Tkinter import *

class Aplic:

def __init__(self,mestre):

frame = Frame(mestre)

frame.pack()

self.bot = Button(frame,text="SAI",fg="red",\

command=frame.quit)

self.bot.pack(side=LEFT)

self.ola = Button(frame,text="Ola",command=self.Ola)

self.ola.pack(side=LEFT)

def Ola(self):

print "Ola, mundo!"

root = Tk()

root.title("Teste")

ap = Aplic(root)

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 218

8 PROGRAMACAO GRAFICA USANDO TK 219

8.2.17 Exemplo: Ola, mundo 8

# usando heranca

from Tkinter import *

class Aplic(Frame):

def __init__(self,mestre):

Frame.__init__(self,mestre)

self.bot = Button(mestre,text="SAI",fg="red",\

command=mestre.quit)

self.bot.pack(side=LEFT)

self.ola = Button(mestre,text="Ola",command=self.Ola)

self.ola.pack(side=LEFT)

def Ola(self):

print "Ola, mundo!"

root = Tk()

root.title("Teste")

ap = Aplic(root)

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 220

Observacoes:

• No comando class Aplic(Frame), Frame indica a classe-pai;

• O comando Frame.__init__(self,mestre), e a chamada do construtor de

Frame.

8 PROGRAMACAO GRAFICA USANDO TK 221

8.2.18 Exemplo: Calculadora

Criando os widgets:

e=""

root = Tk()

root.title("Calc")

frame = Frame(root)

frame2 = Frame(root)

frame.pack(side=TOP)

frame2.pack(side=TOP)

lb = Label(frame,text="",width=20,relief=RIDGE,justify=RIGHT)

lb.pack(fill=X)

b0 = Button(frame2,text="0",bd=3,padx=1,pady=1)

b1 = Button(frame2,text="1",bd=3,padx=1,pady=1)

...

b9 = Button(frame2,text="9",bd=3,padx=1,pady=1)

bmais = Button(frame2,text="+",bd=3,padx=1,pady=1)

bmenos = Button(frame2,text="-",bd=3,padx=1,pady=1)

...

bfecha = Button(frame2,text=")",bd=3,padx=1,pady=1)

8 PROGRAMACAO GRAFICA USANDO TK 222

Layout do teclado:

7 8 9 *

4 5 6 +

1 2 3 -

0 /

( ) =

8 PROGRAMACAO GRAFICA USANDO TK 223

Packing:

b7.grid(row=0,column=0)

b8.grid(row=0,column=1)

b9.grid(row=0,column=2)

bvezes.grid(row=0,column=3)

b4.grid(row=1,column=0)

b5.grid(row=1,column=1)

b6.grid(row=1,column=2)

bmais.grid(row=1,column=3)

b1.grid(row=2,column=0)

b2.grid(row=2,column=1)

b3.grid(row=2,column=2)

bmenos.grid(row=2,column=3)

b0.grid(row=3,column=0)

bdiv.grid(row=3,column=3)

bigual.grid(row=4,column=3)

babre.grid(row=4,column=0)

bfecha.grid(row=4,column=1)

8 PROGRAMACAO GRAFICA USANDO TK 224

Binding:

b0.bind("<Button-1>",digito)

b1.bind("<Button-1>",digito)

...

b9.bind("<Button-1>",digito)

bmais.bind("<Button-1>",opera)

bmenos.bind("<Button-1>",opera)

bvezes.bind("<Button-1>",opera)

bdiv.bind("<Button-1>",opera)

babre.bind("<Button-1>",parenteses)

bfecha.bind("<Button-1>",parenteses)

bigual.bind("<Button-1>",finaliza)

Mainloop:

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 225

Callbacks:

def digito(ev):

global e,lb,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9

if ev.widget==b0:

e+="0"

lb.config(text=e)

elif ev.widget==b1:

e+="1"

lb.config(text=e)

...

elif ev.widget==b8:

e+="8"

lb.config(text=e)

else:

e+="9"

lb.config(text=e)

8 PROGRAMACAO GRAFICA USANDO TK 226

def opera(ev):

global e,lb

if ev.widget==bmais:

e+="+"

lb.config(text=e)

elif ev.widget==bvezes:

e+="*"

lb.config(text=e)

elif ev.widget==bmenos:

e+="-"

lb.config(text=e)

else:

e+="/"

lb.config(text=e)

8 PROGRAMACAO GRAFICA USANDO TK 227

def parenteses(ev):

global e,lb

if ev.widget==babre:

e+="("

lb.config(text=e)

else:

e+=")"

lb.config(text=e)

def finaliza(ev):

global e,lb

try:

r = eval(e)

e=""

lb.config(text=str(r))

except:

e=""

lb.config(text="erro!")

8 PROGRAMACAO GRAFICA USANDO TK 228

8 PROGRAMACAO GRAFICA USANDO TK 229

8.2.19 Exemplo: Calendario

from Tkinter import *

import time,calendar,tkFont,string

root = Tk()

root.title("Calendario")

frame = Frame(root)

frame.pack()

ent = Entry(frame)

ent.bind("<Return>",callback)

font = tkFont.Font(family="Computer",size="16")

lb = Label(frame,width=25,height=10,bg="yellow",font=font,\

justify="left")

data = time.localtime()

ano = data[0]

mes = data[1]

s = calendar.month(ano,mes)

lb.config(text=s)

ent.pack(side=TOP,fill=X)

lb.pack(side=TOP)

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 230

def callback(evento):

global ano,mes,ent,lb

data = ent.get()

if "/" in data:

try:

ind = data.index("/")

mes = string.atoi(data[0:ind])

ano = string.atoi(data[ind+1:len(data)])

s = calendar.month(ano,mes)

lb.config(text=s)

ent.delete(0,END)

except:

ent.delete(0,END)

else:

try:

mes = string.atoi(data)

s = calendar.month(ano,mes)

lb.config(text=s)

ent.delete(0,END)

except:

ent.delete(0,END)

8 PROGRAMACAO GRAFICA USANDO TK 231

8 PROGRAMACAO GRAFICA USANDO TK 232

8.2.20 Widget Entry

Algumas opcoes:

background (bg) Cor do fundo;

borderwidth Espessura da borda;

font O fonte que sera usado dentro do widget;

foreground Cor usada no texto;

justify Controla a forma com que o texto sera alinhado:

LEFT (default), CENTER ou RIGHT;

relief A aparencia do widget;

width Largura do widget (em caracteres de texto).

8 PROGRAMACAO GRAFICA USANDO TK 233

Metodos do widget:

.delete(primeiro, ultimo) Apaga a entrada (exemplo:

e.delete(0,END) apaga toda a entrada);

.get() Obtem a entrada (faz a leitura do widget);

.insert(ındice,string) Insere no widget.

8 PROGRAMACAO GRAFICA USANDO TK 234

8.2.21 Exemplo: Jogo da Velha

from Tkinter import *

final=0

jogaA=1

root=Tk()

frame=Frame(root)

frame.pack()

root.title("Jogo da Velha")

lb=Label(frame,text="Jogador A")

lb.pack(side=TOP)

canvas=Canvas(frame,bg="blue",height=150,width=150,cursor="circle",\

relief=GROOVE)

canvas.pack(side=BOTTOM)

desenha()

canvas.bind("<Button-1>",clique)

tab=[0,0,0,0,0,0,0,0,0]

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 235

Callbacks:

def desenha():

global canvas

canvas.create_line(50,0,50,150,width=3)

canvas.create_line(100,0,100,150,width=3)

canvas.create_line(0,50,150,50,width=3)

canvas.create_line(0,100,150,100,width=3)

8 PROGRAMACAO GRAFICA USANDO TK 236

def desenhacirculo(x,y):

global canvas

canvas.create_oval(x*50+10,y*50+10,x*50+40,y*50+40,width=3)

def desenhacruz(x,y):

global canvas

canvas.create_line(x*50+10,y*50+10,x*50+40,y*50+40,width=3)

canvas.create_line(x*50+10,y*50+40,x*50+40,y*50+10,width=3)

8 PROGRAMACAO GRAFICA USANDO TK 237

def marcaA(x,y):

global tab

tab[y*3+x]=1

def marcaB(x,y):

global tab

tab[y*3+x]=2

8 PROGRAMACAO GRAFICA USANDO TK 238

def posicaoy(y):

if y<50:

return 0

elif y<100:

return 1

else:

return 2

def posicao(x,y):

posy=posicaoy(y)

if x<50:

return (0,posy)

elif x<100:

return(1,posy)

else:

return(2,posy)

8 PROGRAMACAO GRAFICA USANDO TK 239

def ganhou(jog):

global tab

pv=[jog,jog,jog]

if tab[0:3]==pv:

return 1

if tab[3:6]==pv:

return 1

if tab[6:9]==pv:

return 1

if tab[0]==tab[3]==tab[6]==jog:

return 1

if tab[1]==tab[4]==tab[7]==jog:

return 1

if tab[2]==tab[5]==tab[8]==jog:

return 1

if tab[0]==tab[4]==tab[8]==jog:

return 1

if tab[2]==tab[4]==tab[6]==jog:

return 1

return 0

8 PROGRAMACAO GRAFICA USANDO TK 240

def resultado():

global tab

if ganhou(1):

return 1

elif ganhou(2):

return 2

else:

if 0 in tab:

return 0

else:

return 3

8 PROGRAMACAO GRAFICA USANDO TK 241

def clique(event):

global canvas,root,lb,final,jogaA,tab

if final:

canvas.delete(ALL)

desenha()

tab=[0,0,0,0,0,0,0,0,0]

final=0

jogaA=1

lb.config(text="Jogador A")

canvas.config(cursor="circle")

else:

x=canvas.canvasx(event.x)

y=canvas.canvasy(event.y)

x,y=posicao(x,y)

if tab[y*3+x]==0:

if jogaA:

desenhacirculo(x,y)

marcaA(x,y)

else:

desenhacruz(x,y)

marcaB(x,y)

8 PROGRAMACAO GRAFICA USANDO TK 242

jogaA=not jogaA

if jogaA:

lb.config(text="Jogador A")

canvas.config(cursor="circle")

else:

lb.config(text="Jogador B")

canvas.config(cursor="cross")

r=resultado()

if r==1:

lb.config(text="Venceu Jogador A")

final=1

canvas.config(cursor="star")

elif r==2:

lb.config(text="Venceu Jogador B")

final=1

canvas.config(cursor="star")

else:

if r==3:

lb.config(text="Ninguem venceu")

final=1

canvas.config(cursor="star")

8 PROGRAMACAO GRAFICA USANDO TK 243

8 PROGRAMACAO GRAFICA USANDO TK 244

8.2.22 Widget Canvas

Container para objetos graficos (permite definir widgets

personalizados).

Principais opcoes:

borderwidth Espessura da borda;

background Cor de fundo;

cursor Permite escolher o cursor que sera usado quando

o mouse esta sobre o canvas;

height Altura do canvas (em pixels);

width Largura do canvas (em pixels);

8 PROGRAMACAO GRAFICA USANDO TK 245

xscrollcommand Este atributo deve ser o metodo .set

da barra de rolagem horizontal (se possuir barra de

rolagem);

yscrollcommand Este atributo deve ser o metodo .set

da barra de rolagem vertical.

8 PROGRAMACAO GRAFICA USANDO TK 246

Principais objetos (metodos para criacao):

.create arc() Desenha arcos;

.create image() Importa uma imagem (geralmente

GIF);

.create line() Desenha linha;

.create oval() Ovais/cırculos, definido por um bbox (4

coordenadas);

.create polygon() Polıgono definido por uma sequencia

de coordenadas de pontos que formam os vertices do

polıgono;

8 PROGRAMACAO GRAFICA USANDO TK 247

.create rectangle() Retangulo, definido por um bbox

(4 coordenadas);

.create text() Permite colocar texto.

8 PROGRAMACAO GRAFICA USANDO TK 248

8.2.23 Exemplo: Graficos em Pizza

from Tkinter import *

root = Tk()

root.title("Pizza")

canvas = Canvas(root,height=200,width=320)

canvas.pack()

xy = 25,30,295,185 # note a tupla com supress~ao dos parenteses

canvas.create_arc(xy,start=0,extent=250,fill="red")

canvas.create_arc(xy,start=250,extent=70,fill="green")

canvas.create_arc(xy,start=320,extent=40,fill="blue")

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 249

8 PROGRAMACAO GRAFICA USANDO TK 250

8.2.24 Exemplo: Jangada

from Tkinter import *

root = Tk()

root.title("Jangada no mar")

canvas = Canvas(root,width=300,height=100)

canvas.pack()

canvas.create_rectangle(0,0,300,100,fill="lightblue") # ceu

canvas.create_oval(50,35,75,60,fill="yellow",outline="yellow") # sol

canvas.create_rectangle(0,50,300,100,fill="blue",outline="blue") # mar

canvas.create_polygon(150,30,153,27,156,27,159,25,165,30,160,33,155,31,\

152,34,fill="white") # nuvem

canvas.create_polygon(172,20,175,17,178,17,182,15,188,20,183,23,178,21,\

181,22,183,27,175,30,168,28,176,22,fill="white") # nuvem 2

canvas.create_polygon(125,65,127,60,129,55,131,45,133,35,133,65,fill=\

"black") # jangada (vela)

canvas.create_line(133,35,133,70,fill="black") # jangada (mastro)

canvas.create_line(120,70,150,70,fill="black",width=3) # jangada (base)

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 251

8 PROGRAMACAO GRAFICA USANDO TK 252

8.2.25 Exemplo: Clicando e Apagando

root = Tk()

root.title("Jangada no mar 2")

canvas = Canvas(root,width=300,height=100)

canvas.pack()

canvas.create_rectangle(0,0,300,100,fill="lightblue")

canvas.create_oval(50,35,75,60,fill="yellow",outline="yellow",tags=\

"sol")

canvas.create_rectangle(0,50,300,100,fill="blue",outline="blue")

canvas.create_polygon(150,30,153,27,156,27,159,25,165,30,160,33,155,\

31,152,34,fill="white",tags="nuvem")

canvas.create_polygon(172,20,175,17,178,17,182,15,188,20,183,23,178,\

21,181,22,183,27,175,30,168,28,176,22,fill="white",tags="nuvem2")

canvas.create_polygon(125,65,127,60,129,55,131,45,133,35,133,65,fill=\

"black",tags="jangada")

canvas.create_line(133,35,133,70,fill="black",tags="jangada")

canvas.create_line(120,70,150,70,fill="black",width=3,tags="jangada")

8 PROGRAMACAO GRAFICA USANDO TK 253

Observacoes:

• Atribuicao de “tags” aos objetos;

• Um tag pode nomear mais de um objeto e um objeto pode ter mais de um

tag.

8 PROGRAMACAO GRAFICA USANDO TK 254

Binding:

canvas.tag_bind("sol","<Button-1>",apaga_sol)

canvas.tag_bind("nuvem","<Button-1>",apaga_nuvem)

canvas.tag_bind("nuvem2","<Button-1>",apaga_nuvem2)

canvas.tag_bind("jangada","<Button-1>",apaga_jangada)

Mainloop:

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 255

Callbacks:

def apaga_sol(evento):

global canvas

canvas.delete("sol")

def apaga_nuvem(evento):

global canvas

canvas.delete("nuvem")

def apaga_nuvem2(evento):

global canvas

canvas.delete("nuvem2")

def apaga_jangada(evento):

global canvas

canvas.delete("jangada")

8 PROGRAMACAO GRAFICA USANDO TK 256

8.2.26 Exemplo: Arrastando o Sol

Bindings:

canvas.tag_bind("sol","<B1-Motion>",pressionou)

canvas.tag_bind("sol","<ButtonRelease-1>",soltou)

8 PROGRAMACAO GRAFICA USANDO TK 257

Callbacks:

def pressionou(evento):

global xm,ym,inicio_arrasto,xs,ys,sombra

xm,ym=evento.x,evento.y

if inicio_arrasto:

inicio_arrasto=0

sombra = canvas.create_oval(xm-12,ym-12,xm+12,ym+12,\

tags="sombra")

xs,ys=xm,ym

else:

canvas.move("sombra",xm-xs,ym-ys)

xs,ys=xm,ym

def soltou(evento):

global canvas,inicio_arrasto

inicio_arrasto=1

canvas.delete("sombra")

canvas.dtag(sombra,"sombra")

x,y,x2,y2=canvas.bbox("sol")

canvas.move("sol",xm-(x+x2)/2,ym-(y+y2)/2)

8 PROGRAMACAO GRAFICA USANDO TK 258

8.2.27 Movimentando o Sol

Usaremos after(tempo,callback) para gerar interrupcoes de 100ms e

canvas.move(tag,dx,dy) para mover o Sol.

diremov = -1

conta = 0

root = Tk()

...

root.after(100,callback)

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 259

Callback:

def callback():

global root,canvas,diremov,conta

canvas.move("sol",0,diremov)

conta += 1

if conta > 50:

conta = 0

diremov=-1*diremov

root.after(100,callback)

8 PROGRAMACAO GRAFICA USANDO TK 260

8.2.28 Exemplo: Visualizador de Imagens

from Tkinter import *

root = Tk()

canvas = Canvas(root,width=400,height=300)

canvas.pack()

foto = PhotoImage(file="jv.gif")

img = canvas.create_image(0,0,anchor=NW,image=foto)

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 261

8 PROGRAMACAO GRAFICA USANDO TK 262

8.2.29 Widget PhotoImage

Alguns metodos:

get(x,y) Obtem um pixel;

put(dados) Escreve dados na imagem;

write(filename,opcoes) Salva imagem em arquivo;

zoom(escala) Efetua zoom.

8 PROGRAMACAO GRAFICA USANDO TK 263

8.2.30 Definindo um Widget “Custom”

• Exemplo: um novo botao OK;

• Usar Canvas.

8 PROGRAMACAO GRAFICA USANDO TK 264

8.2.31 Exemplo: Usando Menus e Dialogos

from Tkinter import *

def sobre():

win = Toplevel(bd=2)

lb = Label(win,text="Teste do menu")

lb.pack()

root = Tk()

menu = Menu(root)

root.config(menu=menu)

helpmenu = Menu(menu)

menu.add_cascade(label="Ajuda",menu=helpmenu)

helpmenu.add_command(label="Sobre...",command=sobre)

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 265

8 PROGRAMACAO GRAFICA USANDO TK 266

8.2.32 Widget Menu

Algumas opcoes:

background (bg) Cor de fundo;

borderwidth (bd) Espessura da borda do menu;

font Fonte usada no menu.

8 PROGRAMACAO GRAFICA USANDO TK 267

Metodos do widget:

.add cascade() Adiciona um novo elemento em cascata

ao menu;

.add command() Adiciona um comando ao menu;

.delete() Apaga um elemento do menu.

8 PROGRAMACAO GRAFICA USANDO TK 268

8.2.33 Widget Toplevel

E uma janela independente de root (nao e empacotada).

Algumas opcoes:

background Cor de fundo;

height Altura da janela (em pixels);

width Largura da janela (em pixels).

Observacao: Janelas Toplevel (inclusive root) possuem o

metodo .title().

8 PROGRAMACAO GRAFICA USANDO TK 269

8.2.34 Definindo uma Janela Transiente e

Usando grab set()

• Problema 1: O usuario continua com acesso a janela

root;

• Problema 2: O usuario pode minimizar a janela ou o

dialogo de forma independente;

• Solucao do problema 1: .grab set();

• Solucao do problema 2: Janela transiente.

8 PROGRAMACAO GRAFICA USANDO TK 270

8.2.35 Exemplo: Usando Menus e Dialogos 2

from Tkinter import *

def null():

pass

def sobre():

global root

win = Toplevel(bd=2)

lb = Label(win,text="Teste do menu")

lb.pack()

win.transient(root)

win.grab_set()

root = Tk()

menu = Menu(root)

root.config(menu=menu)

helpmenu = Menu(menu)

menu.add_cascade(label="Ajuda",menu=helpmenu)

helpmenu.add_command(label="Sobre...",command=sobre)

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 271

8.2.36 Protocolos

Quando e necessario interferir na comunicacao entre o

aplicativo e o gerenciador de janelas.

Exemplo: w.protocol("WM DELETE WINDOW",handler)

8 PROGRAMACAO GRAFICA USANDO TK 272

8.2.37 Esperando uma Janela

• Usa-se o metodo .wait window(janela) para

aguardar que um determinado widget seja destruido

(entra em um laco de evento local);

• Serve para aguardar que uma janela desapareca da

tela.

8 PROGRAMACAO GRAFICA USANDO TK 273

8.2.38 Widget Listbox

Para apresentar uma lista de alternativas.

Selecao 1

Selecao 2

Selecao 3...

Selecao n

8 PROGRAMACAO GRAFICA USANDO TK 274

lb = Listbox(root)

Metodo .insert() insere no widget.

for i in [’1’,’2’,’3’]:

lb.insert(END,i)

Observacao: END significa inserir no final (na ultima

posicao).

8 PROGRAMACAO GRAFICA USANDO TK 275

Para consultar a selecao do usuario:

itens = lb.curselection()

que retorna uma lista com os ındices dos elementos

selecionados (o usuario pode efetuar selecao multipla).

8 PROGRAMACAO GRAFICA USANDO TK 276

Para apagar os elementos do Listbox use o metodo

.delete().

Para apagar todos os elementos use:

lb.delete(0,END)

8 PROGRAMACAO GRAFICA USANDO TK 277

8.2.39 Widget Scrollbar

Permite criar uma barra de rolagem.

sb = Scrollbar(frame)

lb = Listbox(frame)

lb["yscrollcommand"] = sb.set

sb["command"] = lb.yview

lb.pack(side=LEFT)

sb.pack(side=LEFT,fill=Y)

8 PROGRAMACAO GRAFICA USANDO TK 278

8.2.40 Widget Checkbutton

• Permite selecionar um valor booleano;

• Usa uma variavel de controle para armazenar o

estado do botao;

var = StringVar()

cb = Checkbutton(frame,text="Maiusculas",\

variable=var,onvalue="S",offvalue="N",\

command=TrataBot)

8 PROGRAMACAO GRAFICA USANDO TK 279

8.2.41 Exemplo: Dialogo para Abrir/Salvar Arquivo

Aparencia do dialogo:

8 PROGRAMACAO GRAFICA USANDO TK 280

Uso da classe MyFileDialog:

import MyFileDialog

d = MyFileDialog.MyFileDialog(root,"Abrir arquivo")

filename = d.Get_Output()

8 PROGRAMACAO GRAFICA USANDO TK 281

Modulos importados pela classe:

from Tkinter import *

import os, os.path, string

8 PROGRAMACAO GRAFICA USANDO TK 282

Classe MyFileDialog e seu metodo construtor:

class MyFileDialog:

"MyFileDialog class - creates a Toplevel window for the dialog"

def __init__(self,parent,title):

self.output = ""

top = Toplevel()

top.title(title)

top.transient(parent)

parent.protocol("WM_DELETE_WINDOW",self.null)

d = MyDialog(top,self.output)

d.pack()

top.protocol("WM_DELETE_WINDOW",d.Cancel)

d.grab_set()

d.wait_window(d)

parent.protocol("WM_DELETE_WINDOW",parent.quit)

self.output=d.GetOutput()

8 PROGRAMACAO GRAFICA USANDO TK 283

Outros metodos da classe MyFileDialog:

def null(self):

pass

def Get_Output(self):

return (self.output)

8 PROGRAMACAO GRAFICA USANDO TK 284

Classe MyDialog e seu metodo construtor:

class MyDialog(Frame):

"MyDialog class - dialog for file save and open"

def __init__(self,parent,output):

Frame.__init__(self,parent)

self.output=output

self.top=parent

self.framefilename = Frame(self,bd=2)

self.framelistfile = Frame(self,bd=2)

self.framebuttons = Frame(self,bd=2)

self.lbl = Label(self.framefilename,text="File:")

self.ent = Entry(self.framefilename,width=fields_size())

self.ent.focus_set()

self.ent.bind("<Return>",self.Enter)

self.lblpath = Label(self.framefilename,text="Path:")

self.path = Label(self.framefilename,text=Get_path(),\

width=fields_size(),justify=LEFT,relief=GROOVE)

self.sb = Scrollbar(self.framelistfile)

self.sb2 = Scrollbar(self.framelistfile,orient=\

HORIZONTAL)

8 PROGRAMACAO GRAFICA USANDO TK 285

self.list = Listbox(self.framelistfile,width=\

fields_size())

self.event_add("<<select>>","<Double-Button-1>")

self.list.bind("<<select>>",self.Doubleclick)

self.list["yscrollcommand"]=self.sb.set

self.sb["command"] = self.list.yview

self.list["xscrollcommand"] = self.sb2.set

self.sb2["command"] = self.list.xview

self.var = StringVar()

self.cb = Checkbutton(self.framebuttons,text="Show \

hidden files",variable=self.var,onvalue="show",offvalue="hidden",\

command=self.Showhide)

self.ok = Button(self.framebuttons,text="Ok",\

command=self.Ok)

self.cancel = Button(self.framebuttons,text=\

"Cancel",command=self.Cancel)

self.framefilename.pack(anchor=N)

self.framelistfile.pack(side=TOP)

self.framebuttons.pack(side=BOTTOM)

self.lbl.grid(row=0,column=0)

self.ent.grid(row=0,column=1)

8 PROGRAMACAO GRAFICA USANDO TK 286

self.lblpath.grid(row=1,column=0)

self.path.grid(row=1,column=1)

self.list.grid(row=1,column=0)

self.sb.grid(row=1,column=1,sticky=N+S)

self.sb2.grid(row=2,sticky=W+E)

self.cb.pack(anchor=N)

self.ok.pack(side=LEFT)

self.cancel.pack(side=RIGHT)

ld = os.listdir(".")

ld.sort()

ld.insert(0,"..")

for input in ld:

self.list.insert(END,input)

self.cb.toggle()

8 PROGRAMACAO GRAFICA USANDO TK 287

Outros metodos da classe MyDialog:

def GetOutput(self):

return self.output

def Showhide(self):

"Handler for the checkbutton"

if self.var.get() == "show":

ld = os.listdir(".")

ld.sort()

ld.insert(0,"..")

self.list.delete(0,END)

for input in ld:

self.list.insert(END,input)

else:

ld = os.listdir(".")

ld.sort()

self.list.delete(0,END)

ld = Hide(ld)

ld.insert(0,"..")

for input in ld:

self.list.insert(END,input)

8 PROGRAMACAO GRAFICA USANDO TK 288

def Enter(self,event):

"Handler for the filenames entry field"

selection = self.ent.get()

if os.path.isdir(selection): # is dir

os.chdir(selection)

self.list.delete(0,END)

ld = os.listdir(".")

ld.sort()

ld.insert(0,"..")

for input in ld:

self.list.insert(END,input)

self.path["text"] = Get_path()

else:

self.output = selection

self.top.destroy()

def Doubleclick(self,event):

"Handler for Double clicking in the listbox"

self.Ok()

def Ok(self):

"Handler for the Ok button"

self.ent.delete(0,END)

8 PROGRAMACAO GRAFICA USANDO TK 289

selection = self.list.curselection()

if selection != ():

s = string.atoi(selection[0])

ld = os.listdir(".")

ld.sort()

if self.var.get() != "show":

ld=Hide(ld)

if s!=0:

fop = ld[s-1]

if os.path.isdir(fop):

os.chdir(fop)

self.list.delete(0,END)

ld = os.listdir(".")

ld.sort()

if self.var.get() != "show":

ld=Hide(ld)

ld.insert(0,"..")

for input in ld:

self.list.insert(END,\

input)

self.path["text"] = Get_path()

8 PROGRAMACAO GRAFICA USANDO TK 290

else:

self.output = fop

self.top.destroy()

else:

os.chdir("..")

self.list.delete(0,END)

ld = os.listdir(".")

ld.sort()

if self.var.get() != "show":

ld=Hide(ld)

ld.insert(0,"..")

for input in ld:

self.list.insert(END,input)

self.path["text"] = Get_path()

else:

selection = self.ent.get()

if selection != "":

self.output = selection

self.top.destroy()

else:

pass

8 PROGRAMACAO GRAFICA USANDO TK 291

def Cancel(self):

"Handler for Cancel button"

self.output = ""

self.top.destroy()

8 PROGRAMACAO GRAFICA USANDO TK 292

Funcoes auxiliares do modulo:

def fields_size():

return 30

def Get_path():

"Get the absolute path from working path"

dir = os.path.abspath(".")

if len(dir) > fields_size():

dir = dir[:fields_size()/2-2]+"..."+dir[len(dir)-\

fields_size()/2+2:]

return dir

def Hide(list):

"Hide function - Removes all hidden files from a list"

list2 = []

for i in list:

if i[0]!=’.’:

list2.append(i)

return list2

8 PROGRAMACAO GRAFICA USANDO TK 293

8.2.42 Widget Text

Widget mais geral para tratar com textos.

Algumas opcoes:

background Cor do fundo;

borderwidth Espessura da borda;

font Fonte usado no texto;

foreground Cor do texto;

height Altura do widget (em linhas);

relief Identico aos widgets anteriores;

width Largura do widget (em caracteres de texto);

8 PROGRAMACAO GRAFICA USANDO TK 294

wrap Opcao que indica como sera tratado o texto que

exceder o espaco disponıvel na linha;

xscrollcommand Para usar barra de rolagem

horizontal;

yscrollcommand Para usar barra de rolagem vertical.

8 PROGRAMACAO GRAFICA USANDO TK 295

Para manipular o texto sao usados ındices.

Indices:

linha.coluna Posicao apos a coluna;

linha.end Ao final da linha;

INSERT Posicao de insercao;

CURRENT Posicao mais proxima ao cursor do mouse;

END Ao final do texto;

SEL FIRST Imediatamente antes do texto selecionado;

SEL LAST Imediatamente apos o exto selecionado.

8 PROGRAMACAO GRAFICA USANDO TK 296

Metodos do widget:

.delete() Apagar texto;

.get() Obter texto;

.insert() Inserir texto;

.search() Procurar um padrao.

8 PROGRAMACAO GRAFICA USANDO TK 297

8.2.43 Exemplo: Editor ASCII

Aparencia do programa:

8 PROGRAMACAO GRAFICA USANDO TK 298

Menus do programa:

8 PROGRAMACAO GRAFICA USANDO TK 299

#!/usr/bin/python

from Tkinter import *

import MyFileDialog

import os.path

# ASCII editor

# Version: 0.5

# Author: Carlos Campani

# campani@ufpel.tche.br

# Use under GNU/GPL

def OpenFile():

"Handler for OpenFile event"

global root,text,is_saved,filename

d = MyFileDialog.MyFileDialog(root,"Open File")

filename = d.Get_Output()

try:

8 PROGRAMACAO GRAFICA USANDO TK 300

if filename != "":

f = open(filename,"r")

s=f.read()

text.delete(1.0,END)

text.insert(END,s)

f.close()

root.title("Editor V0.1 - "+filename)

is_saved = 1

except IOError:

Msg("Error","File ’%s’ not found"%(filename))

def Save():

"Handler for Save event"

global root,text,is_saved,filename

if filename == "":

SaveAs()

else:

f = open(filename,"w")

8 PROGRAMACAO GRAFICA USANDO TK 301

s=text.get(1.0,END)

s=s.encode("latin1")

f.write(s)

f.close()

is_saved = 1

def SaveAs():

"Handler for SaveAs event"

global root,text,is_saved,filename

d = MyFileDialog.MyFileDialog(root,"Save As")

filename = d.Get_Output()

if filename != "":

if os.path.isfile(filename):

if Question("Question","File ’%s’ already \

exists. Continue?"%(filename)):

f = open(filename,"w")

8 PROGRAMACAO GRAFICA USANDO TK 302

s=text.get(1.0,END)

s=s.encode("latin1")

f.write(s)

f.close()

root.title("Editor V0.1 - "+filename)

is_saved = 1

else:

f = open(filename,"w")

s=text.get(1.0,END)

s=s.encode("latin1")

f.write(s)

f.close()

root.title("Editor V0.1 - "+filename)

is_saved = 1

def Cut():

"Handler for Cut event"

global clipboard,text

8 PROGRAMACAO GRAFICA USANDO TK 303

ocorreu = 0

try:

clip = text.get(SEL_FIRST,SEL_LAST)

text.delete(SEL_FIRST,SEL_LAST)

except:

ocorreu = 1

if not ocorreu:

clipboard = clip

root.clipboard_clear()

root.clipboard_append(clip)

def Copy():

"Handler for Copy event"

global clipboard,text

ocorreu = 0

try:

clip = text.get(SEL_FIRST,SEL_LAST)

except:

8 PROGRAMACAO GRAFICA USANDO TK 304

ocorreu = 1

if not ocorreu:

clipboard = clip

root.clipboard_clear()

root.clipboard_append(clip)

def Paste():

"Handler for Paste event"

global clipboard,text

text.insert(INSERT,clipboard)

def Outofhere(): # destroy message window (global win)

global win

win.destroy()

8 PROGRAMACAO GRAFICA USANDO TK 305

def null(): # do nothing

pass

def About():

"Handler for About event"

Msg("About","Editor V0.1\nVersion: 0.5\nAuthor: Carlos \

Campani\ncampani@ufpel.tche.br\nUse under GNU/GPL")

def Msg(title,msg,size=250): # opens a message window

global root,win

win = Toplevel(bd=2)

fra = Frame(win,bd=2)

win.title(title)

fra.pack()

but = Button(fra,text="Ok",command=Outofhere)

but2 = Button(fra,bitmap="info")

8 PROGRAMACAO GRAFICA USANDO TK 306

msg = Message(fra,text=msg,width=size,justify=CENTER)

but2.pack(anchor=NW)

msg.pack()

but.pack(anchor=SE)

root.protocol("WM_DELETE_WINDOW",null)

win.transient(root)

win.grab_set()

win.wait_window(win)

root.protocol("WM_DELETE_WINDOW",root.quit)

def Tok(): # handler Ok button for question window

global que,win2

que = 1

win2.destroy()

8 PROGRAMACAO GRAFICA USANDO TK 307

def Tcancel(): # handler Cancel button for question window

global que,win2

que = 0

win2.destroy()

def Question(title,msg,size=250): # opens a question window

global root,win2,que

que = 0

win2 = Toplevel(bd=2)

fra = Frame(win2,bd=2)

win2.title(title)

fra.pack()

butok = Button(fra,text="Ok",command=Tok,padx=2)

butcancel = Button(fra,text="Cancel",command=Tcancel,padx=2)

butinfo = Button(fra,bitmap="info")

8 PROGRAMACAO GRAFICA USANDO TK 308

msg = Message(fra,text=msg,width=size,justify=CENTER)

butinfo.pack(anchor=NW)

msg.pack()

butok.pack(anchor=SE)

butcancel.pack(anchor=SE)

root.protocol("WM_DELETE_WINDOW",null)

win2.transient(root)

win2.wait_window(win2)

root.protocol("WM_DELETE_WINDOW",root.quit)

return que

is_saved = 0 # global variable

filename = "" # global variable - stores file name (string)

clipboard = "" # global variable - stores data used by Copy, Cut \

and Paste

8 PROGRAMACAO GRAFICA USANDO TK 309

root = Tk()

root.title("Editor V0.1")

root.clipboard_clear() # cleaning Tks clipboard

menu = Menu(root) # defining menus

root.config(menu=menu)

filemenu = Menu(menu)

menu.add_cascade(label="File",underline=0,menu=filemenu)

filemenu.add_command(label="Open...",underline=0,command=OpenFile)

filemenu.add_command(label="Save",underline=0,command=Save)

filemenu.add_command(label="Save As...",underline=5,command=SaveAs)

filemenu.add_separator()

filemenu.add_command(label="Exit",underline=0,command=root.quit)

editmenu = Menu(menu)

menu.add_cascade(label="Edit",underline=0,menu=editmenu)

editmenu.add_command(label="Cut",underline=1,command=Cut)

editmenu.add_command(label="Copy",underline=0,command=Copy)

editmenu.add_command(label="Paste",underline=0,command=Paste)

8 PROGRAMACAO GRAFICA USANDO TK 310

helpmenu = Menu(menu)

menu.add_cascade(label="Help",menu=helpmenu)

helpmenu.add_command(label="About...",command=About)

frame = Frame(root) # creating other widgets

text = Text(frame,bg="white")

sb = Scrollbar(frame)

text["yscrollcommand"] = sb.set

sb["command"] = text.yview

text.pack(side=LEFT,fill=BOTH) # packing

sb.pack(side=RIGHT,fill=Y)

frame.pack(fill=BOTH)

root.mainloop()

8 PROGRAMACAO GRAFICA USANDO TK 311

8.3 Extensoes: Tix, BLT, Wxpython e

Python Mega Widgets

Tix Fornece novos widgets e um novo empacotador com

mais recursos;

BLT Pacote que extende a biblioteca Tk;

Wxpython Conjunto de widgets mais sofisticados;

Provavelmente devera tornar-se o padrao; Home

page: http://wxpython.org;

Python Mega Widgets Conjunto de widgets mais

sofisticados; Home page:

http://pmw.sourceforge.net;

8 PROGRAMACAO GRAFICA USANDO TK 312

8.4 Programacao Visual com Tk

VTCL Programacao visual em Tcl/Tk; Home page:

http://vtcl.sourceforge.net.

8 PROGRAMACAO GRAFICA USANDO TK 313

Recommended