Вы находитесь на странице: 1из 313

1

Introducao a Programacao em Python e


Tk
Carlos A. P. Campani

22 de abril de 2005
2

c
Copyright 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 includa 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 Caractersticas 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 cientfica (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 = "Gr^
emio FBPA"
>>> y = " - o maior de todos"
>>> print x+y
Gr^
emio 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

Valor
15

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 programas


Python 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; reconhece


programas Python e permite executar o programa dentro do
proprio 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 Verssimo" e o nome de um grande escritor
"Erico Verssimo" 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 vrgulas).
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 sequ^


encia
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-Sada. Ex: PASCAL (Passagem por
Referencia VAR);
Tipo Sada (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 assncronos;
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 Hidrog^
enio (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 inst^
ancia
...
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
N
ss NNN
ss NNN
ssss NNN
sy s N&
Leite Sucrilhos
7 PYTHON AVANCADO 125

7 Python Avancado

7.1 Modulo Gnuplot - Programacao


Cientfica
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


Cientfica
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 lnguas, de forma que o usuario
possa escolher a lngua 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/sada 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

Famlia 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 prefer^encia 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 "Prefer^
encia: %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 P ython



T kinter (P ython)

tkinter (C)

T k widgets (C e T cl)

T k (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 raz (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 disponvel: 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 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
disponvel).
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 especfico 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 (centmetros), 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

Nveis de binding:
Binding de instancia - binding de um evento com
um widget especfico;
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/crculos, definido por um bbox (4
coordenadas);
.create polygon() Polgono definido por uma sequencia
de coordenadas de pontos que formam os vertices do
polgono;
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 par^
enteses
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 disponvel 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