Introdução à Programação Python e Tk
-
Upload
carlos-campani -
Category
Technology
-
view
5.638 -
download
9
description
Transcript of Introdução à Programação Python e Tk
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 "<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 "<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
# 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\[email protected]\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