313
1 Introdu¸c˜ ao ` aPrograma¸c˜ ao em Python e Tk Carlos A. P. Campani 22 de abril de 2005

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

Embed Size (px)

DESCRIPTION

Lâminas para um curso de Python e Tk

Citation preview

Page 1: Introdução à Programação Python e Tk

1

Introducao a Programacao em Python eTk

Carlos A. P. Campani

22 de abril de 2005

Page 2: Introdução à Programação Python e Tk

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.

Page 3: Introdução à Programação Python e Tk

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

Page 4: Introdução à Programação Python e Tk

REFERENCIAS 4

Links

(Python Language Website)

http://www.python.org

(Python Resources)

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

(Tcl/Tk Site)

http://www.tcl.tk

Page 5: Introdução à Programação Python e 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

Page 6: Introdução à Programação Python e Tk

REFERENCIAS 6

Programas

• Python 2.1;

• Tk 8;

• Python-tkinter 2.1;

• vi;

• emacs;

• gnuplot e modulo Gnuplot;

Page 7: Introdução à Programação Python e Tk

REFERENCIAS 7

• Numeric 2.0;

• MySQL 3;

• Python-MySQLdb;

• XFreeGL (OpenGL)/ Mesa3D;

• PyOpenGL 2.

• PIL 1.1.5

Page 8: Introdução à Programação Python e Tk

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.

Page 9: Introdução à Programação Python e Tk

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

Page 10: Introdução à Programação Python e Tk

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.

Page 11: Introdução à Programação Python e Tk

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;

Page 12: Introdução à Programação Python e Tk

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;

Page 13: Introdução à Programação Python e Tk

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);

Page 14: Introdução à Programação Python e Tk

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!

Page 15: Introdução à Programação Python e Tk

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.

Page 16: Introdução à Programação Python e Tk

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.

>>>

Page 17: Introdução à Programação Python e Tk

4 USANDO O INTERPRETADOR 17

Control-D abandona o interpretador.

>>> ^D

$

Page 18: Introdução à Programação Python e Tk

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 ...

Page 19: Introdução à Programação Python e Tk

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.

>>>

Page 20: Introdução à Programação Python e Tk

4 USANDO O INTERPRETADOR 20

Atencao!

• Atribuicao: =;

• Igualdade: ==.

(inspirado em C)

Page 21: Introdução à Programação Python e Tk

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

Page 22: Introdução à Programação Python e Tk

4 USANDO O INTERPRETADOR 22

>>> x = 15

>>> x

15

>>> x = 3.1415

>>> x

3.1415000000000002

Lembre-se: Tipagem dinamica!

Page 23: Introdução à Programação Python e Tk

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

Page 24: Introdução à Programação Python e Tk

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

Page 25: Introdução à Programação Python e Tk

4 USANDO O INTERPRETADOR 25

>>> if 1: print "verdadeiro"

...

verdadeiro

>>> if 0: print "verdadeiro"

...

>>>

Observacoes:

• Valores-verdade: 0 e 1;

• ... e o prompt secundario.

Page 26: Introdução à Programação Python e Tk

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!).

Page 27: Introdução à Programação Python e Tk

4 USANDO O INTERPRETADOR 27

Tupla:

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

>>> x[0]

1

>>> x[1]

2

>>> x[-1]

3

>>> x[-2]

2

>>>

Page 28: Introdução à Programação Python e Tk

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]

Page 29: Introdução à Programação Python e Tk

4 USANDO O INTERPRETADOR 29

>>> x

[10,2,3,1000]

>>>

Page 30: Introdução à Programação Python e Tk

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

Page 31: Introdução à Programação Python e Tk

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.

Page 32: Introdução à Programação Python e Tk

4 USANDO O INTERPRETADOR 32

15

X

Valor

Namespace

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

Page 33: Introdução à Programação Python e Tk

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

Page 34: Introdução à Programação Python e Tk

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

Page 35: Introdução à Programação Python e Tk

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!

$

Page 36: Introdução à Programação Python e Tk

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;

Page 37: Introdução à Programação Python e Tk

4 USANDO O INTERPRETADOR 37

Page 38: Introdução à Programação Python e Tk

4 USANDO O INTERPRETADOR 38

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

Page 39: Introdução à Programação Python e Tk

4 USANDO O INTERPRETADOR 39

Page 40: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 40

5 Programacao Basica Python

5.1 Identificadores

Exemplos: x, a10, carlos campani

Observacao: x 6= X

Page 41: Introdução à Programação Python e Tk

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

Page 42: Introdução à Programação Python e Tk

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

>>>

Page 43: Introdução à Programação Python e Tk

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!

>>>

Page 44: Introdução à Programação Python e Tk

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

Page 45: Introdução à Programação Python e Tk

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!

Page 46: Introdução à Programação Python e Tk

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

Page 47: Introdução à Programação Python e Tk

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.

Page 48: Introdução à Programação Python e Tk

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.

Page 49: Introdução à Programação Python e Tk

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

Page 50: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 50

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

... print "contido"

...

contido

Page 51: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 51

• Operadores de bits:

Operador Descricao

| ou

^ ou exclusivo

& e

<< desloca para a esquerda

>> desloca para a direita

~ negacao

Page 52: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 52

Exemplos:

>>> 3 | 4

7

>>> 3 & 4

0

>>> 4 << 1

8

>>> 4 << 2

16

>>> ~3

-4

Page 53: Introdução à Programação Python e Tk

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.

Page 54: Introdução à Programação Python e Tk

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

Page 55: Introdução à Programação Python e Tk

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]

Page 56: Introdução à Programação Python e Tk

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]

Page 57: Introdução à Programação Python e Tk

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

Page 58: Introdução à Programação Python e Tk

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

Page 59: Introdução à Programação Python e Tk

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]

Page 60: Introdução à Programação Python e Tk

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]

Page 61: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 61

Implementando CAR e CDR:

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

>>> s[0] # CAR

1

>>> s[1:] # CDR

[2,3]

Page 62: Introdução à Programação Python e Tk

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’

Page 63: Introdução à Programação Python e Tk

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

Page 64: Introdução à Programação Python e Tk

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

Page 65: Introdução à Programação Python e Tk

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

Page 66: Introdução à Programação Python e Tk

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;

Page 67: Introdução à Programação Python e Tk

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;

Page 68: Introdução à Programação Python e Tk

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;

Page 69: Introdução à Programação Python e Tk

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]

Page 70: Introdução à Programação Python e Tk

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

Page 71: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 71

str(x) Converte para string;

tuple(s) Converte uma sequencia para uma tupla;

Exemplo:

>>> tuple("abc")

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

Page 72: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 72

5.7 Estruturas de Controle

5.7.1 if

if x>0: print "maior que zero"

Page 73: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 73

if a>b:

print a

else:

print b

Observe endentacao (com brancos ou tabulacoes, mas

sempre coerente).

Page 74: Introdução à Programação Python e Tk

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.

Page 75: Introdução à Programação Python e Tk

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

Page 76: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 76

5.7.3 for

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

... print i

...

1

2

3

4

5

>>>

Page 77: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 77

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

... print i

...

1

2

3

4

5

>>>

Page 78: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 78

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

... print i

...

Ticiano

Jo~ao Vitor

Luana

Page 79: Introdução à Programação Python e Tk

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’]

Page 80: Introdução à Programação Python e Tk

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]

Page 81: Introdução à Programação Python e Tk

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]

Page 82: Introdução à Programação Python e Tk

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

Page 83: Introdução à Programação Python e Tk

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)

Page 84: Introdução à Programação Python e Tk

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

Page 85: Introdução à Programação Python e Tk

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.

Page 86: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 86

Exemplo:

x = 0

try:

y=1/x

except ZeroDivisionError:

print "erro"

Page 87: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 87

Observacao: except pode receber mais de um erro

(identificadores de erros separados por vırgulas).

Page 88: Introdução à Programação Python e Tk

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

Page 89: Introdução à Programação Python e Tk

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.

Page 90: Introdução à Programação Python e Tk

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.

Page 91: Introdução à Programação Python e Tk

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

Page 92: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 92

Para declarar uma variavel como global use a declaracao

global.

Exemplo:

def teste():

global x

x = 15

Page 93: Introdução à Programação Python e Tk

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

Page 94: Introdução à Programação Python e Tk

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

Page 95: Introdução à Programação Python e Tk

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)

Page 96: Introdução à Programação Python e Tk

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).

Page 97: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 97

Para declarar funcoes anonimas, Python usa notacao

lambda:

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

>>> print f(10,15)

25

Page 98: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 98

Para documentar as funcoes use strings de documentacao.

def ola():

" Esta func~ao e um exemplo "

pass

Page 99: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 99

5.10 Programacao Funcional

Listas+CAR+CDR+Funcoes Anonimas=Programacao

Funcional

Page 100: Introdução à Programação Python e Tk

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().

Page 101: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 101

Exemplo:

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

>>> x = f.read()

>>> f.close()

Page 102: Introdução à Programação Python e Tk

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.

Page 103: Introdução à Programação Python e Tk

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’]

Page 104: Introdução à Programação Python e Tk

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()

>>>

Page 105: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 105

string Tratamento de strings;

>>> import string

>>> string.atoi("15")

15

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

’Como vai?’

>>>

Page 106: Introdução à Programação Python e Tk

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

Page 107: Introdução à Programação Python e Tk

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

Page 108: Introdução à Programação Python e Tk

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

>>>

Page 109: Introdução à Programação Python e Tk

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;

Page 110: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 110

gzip Compressao e descompressao gzip;

readline GNU readline;

zipfile Manuseio de arquivos zip.

Page 111: Introdução à Programação Python e Tk

5 PROGRAMACAO BASICA PYTHON 111

5.13 Pydoc

Completa documentacao dos modulos do Python ao

estilo das man pages do Unix.

$ pydoc sys

Page 112: Introdução à Programação Python e Tk

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.

Page 113: Introdução à Programação Python e Tk

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;

Page 114: Introdução à Programação Python e Tk

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.

Page 115: Introdução à Programação Python e Tk

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.

Page 116: Introdução à Programação Python e Tk

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.

Page 117: Introdução à Programação Python e Tk

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

>>>

Page 118: Introdução à Programação Python e Tk

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.

Page 119: Introdução à Programação Python e Tk

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

...

Page 120: Introdução à Programação Python e Tk

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)

Page 121: Introdução à Programação Python e Tk

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.

Page 122: Introdução à Programação Python e Tk

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

...

Page 123: Introdução à Programação Python e Tk

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))

Page 124: Introdução à Programação Python e Tk

6 PROGRAMACAO ORIENTADA A OBJETOS 124

Alimento

yyssssssssss

&&NNNNNNNNNNN

Leite Sucrilhos

Page 125: Introdução à Programação Python e Tk

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.

Page 126: Introdução à Programação Python e Tk

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")

Page 127: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 127

Page 128: Introdução à Programação Python e Tk

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")

Page 129: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 129

Page 130: Introdução à Programação Python e Tk

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.

Page 131: Introdução à Programação Python e Tk

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.]]

Page 132: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 132

>>> print a.shape

(3,3)

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

>>> print a

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

Page 133: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 133

Determinante:

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

>>> a = a*10

>>> print a

[[10.,10.],

[10.,10.]]

>>> print determinant(a)

0.0

Page 134: Introdução à Programação Python e Tk

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

Page 135: Introdução à Programação Python e Tk

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]]

Page 136: Introdução à Programação Python e Tk

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]]

Page 137: Introdução à Programação Python e Tk

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.

Page 138: Introdução à Programação Python e Tk

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.

Page 139: Introdução à Programação Python e Tk

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}

};

Page 140: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 140

void initSomalib() {

(void) Py_InitModule("Somalib",

Somalib_methods);

}

Page 141: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 141

Como compilar:

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

cc -shared Somalib.o -o Somalib.so

Page 142: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 142

Como Python encontra os modulos?

• PYTHONPATH;

• Diretorio corrente;

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

Page 143: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 143

Como usar:

>>> import Somalib

>>> Somalib.soma(10,20)

30

ou

>>> from Somalib import *

>>> soma(10,20)

30

Page 144: Introdução à Programação Python e Tk

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;

}

Page 145: Introdução à Programação Python e Tk

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);

}

Page 146: Introdução à Programação Python e Tk

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);

}

Page 147: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 147

Para retornar None:

Py_INCREF(Py_None)

return Py_None

Page 148: Introdução à Programação Python e Tk

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.

Page 149: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 149

#include "stdio.h"

main()

{

int x;

scanf("%d",&x);

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

}

$ gcc -o teste.o teste.c

Page 150: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 150

>>> import os

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

>>> f.write("15")

>>> f.flush()

>>> f.close()

Page 151: Introdução à Programação Python e Tk

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.

Page 152: Introdução à Programação Python e Tk

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()’)

Page 153: Introdução à Programação Python e Tk

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)

Page 154: Introdução à Programação Python e Tk

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).

Page 155: Introdução à Programação Python e Tk

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);

Page 156: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 156

7.7.1 Exemplo: Programa Esferas

from OpenGL.GL import *

from OpenGL.GLU import *

from OpenGL.GLUT import *

Page 157: Introdução à Programação Python e Tk

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()

Page 158: Introdução à Programação Python e Tk

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()

Page 159: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 159

Page 160: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 160

7.8 PIL - Python Imaging Library

• Processamento de imagens;

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

Page 161: Introdução à Programação Python e Tk

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")

Page 162: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 162

7.9 Usando MySQL

• Modulo Python-MySQLdb;

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

Page 163: Introdução à Programação Python e Tk

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

Page 164: Introdução à Programação Python e Tk

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’")

Page 165: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 165

>>> print curs.fetchall()

((’Hamster’,),)

>>> curs.close()

>>> con.close()

Page 166: Introdução à Programação Python e Tk

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);

Page 167: Introdução à Programação Python e 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.

Page 168: Introdução à Programação Python e Tk

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.

Page 169: Introdução à Programação Python e Tk

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!"

Page 170: Introdução à Programação Python e Tk

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>

Page 171: Introdução à Programação Python e Tk

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>

Page 172: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 172

#!/usr/bin/python

import cgi

print "Content-Type: text/html"

print

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

form=cgi.FieldStorage()

Prefere=form.getvalue("Prefere")

Valor=form.getvalue("Valor")

Sexo=form.getvalue("Sexo")

if Prefere=="0":

Preferencia=""

elif Prefere=="1":

Preferencia="Carro"

else:

Preferencia="Casa"

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

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

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

Page 173: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 173

Curiosidade:

http://www.google.com

GOOGLE=Linux+Python+MySQL

Page 174: Introdução à Programação Python e Tk

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()

Page 175: Introdução à Programação Python e Tk

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()

Page 176: Introdução à Programação Python e Tk

7 PYTHON AVANCADO 176

7.13 Processamento de Audio -

Ecasound

Processamento de audio em Python/Linux.

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

Page 177: Introdução à Programação Python e Tk

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;

Page 178: Introdução à Programação Python e Tk

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;

Page 179: Introdução à Programação Python e Tk

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.

Page 180: Introdução à Programação Python e Tk

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

Page 181: Introdução à Programação Python e Tk

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;

Page 182: Introdução à Programação Python e Tk

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.

Page 183: Introdução à Programação Python e Tk

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()

Page 184: Introdução à Programação Python e Tk

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).

Page 185: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 185

Page 186: Introdução à Programação Python e Tk

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.

Page 187: Introdução à Programação Python e Tk

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

Page 188: Introdução à Programação Python e Tk

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;

Page 189: Introdução à Programação Python e Tk

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.

Page 190: Introdução à Programação Python e Tk

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).

Page 191: Introdução à Programação Python e Tk

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

Page 192: Introdução à Programação Python e Tk

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.

Page 193: Introdução à Programação Python e Tk

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

Page 194: Introdução à Programação Python e Tk

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).

Page 195: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 195

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

explicitamente o widget;

Page 196: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 196

Cuidado! Os empacotadores podem ser usados juntos em

uma aplicacao, mas nao em um mesmo frame.

Page 197: Introdução à Programação Python e Tk

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.

Page 198: Introdução à Programação Python e Tk

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;

Page 199: Introdução à Programação Python e Tk

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”.

Page 200: Introdução à Programação Python e Tk

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.

Page 201: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 201

Page 202: Introdução à Programação Python e Tk

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.

Page 203: Introdução à Programação Python e Tk

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.

Page 204: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 204

Page 205: Introdução à Programação Python e Tk

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;

Page 206: Introdução à Programação Python e Tk

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.

Page 207: Introdução à Programação Python e Tk

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.

Page 208: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 208

Page 209: Introdução à Programação Python e Tk

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;

Page 210: Introdução à Programação Python e Tk

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()

Page 211: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 211

Page 212: Introdução à Programação Python e Tk

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;

Page 213: Introdução à Programação Python e Tk

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>);

Page 214: Introdução à Programação Python e Tk

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);

Page 215: Introdução à Programação Python e Tk

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;

Page 216: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 216

• Eventos virtuais:

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

"Button-2")

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

Page 217: Introdução à Programação Python e Tk

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()

Page 218: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 218

Page 219: Introdução à Programação Python e Tk

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()

Page 220: Introdução à Programação Python e Tk

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.

Page 221: Introdução à Programação Python e Tk

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)

Page 222: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 222

Layout do teclado:

7 8 9 *

4 5 6 +

1 2 3 -

0 /

( ) =

Page 223: Introdução à Programação Python e Tk

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)

Page 224: Introdução à Programação Python e Tk

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()

Page 225: Introdução à Programação Python e Tk

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)

Page 226: Introdução à Programação Python e Tk

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)

Page 227: Introdução à Programação Python e Tk

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!")

Page 228: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 228

Page 229: Introdução à Programação Python e Tk

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()

Page 230: Introdução à Programação Python e Tk

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)

Page 231: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 231

Page 232: Introdução à Programação Python e Tk

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).

Page 233: Introdução à Programação Python e Tk

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.

Page 234: Introdução à Programação Python e Tk

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()

Page 235: Introdução à Programação Python e Tk

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)

Page 236: Introdução à Programação Python e Tk

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)

Page 237: Introdução à Programação Python e Tk

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

Page 238: Introdução à Programação Python e Tk

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)

Page 239: Introdução à Programação Python e Tk

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

Page 240: Introdução à Programação Python e Tk

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

Page 241: Introdução à Programação Python e Tk

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)

Page 242: Introdução à Programação Python e Tk

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")

Page 243: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 243

Page 244: Introdução à Programação Python e Tk

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);

Page 245: Introdução à Programação Python e Tk

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.

Page 246: Introdução à Programação Python e Tk

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;

Page 247: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 247

.create rectangle() Retangulo, definido por um bbox

(4 coordenadas);

.create text() Permite colocar texto.

Page 248: Introdução à Programação Python e Tk

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()

Page 249: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 249

Page 250: Introdução à Programação Python e Tk

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()

Page 251: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 251

Page 252: Introdução à Programação Python e Tk

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")

Page 253: Introdução à Programação Python e Tk

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.

Page 254: Introdução à Programação Python e Tk

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()

Page 255: Introdução à Programação Python e Tk

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")

Page 256: Introdução à Programação Python e Tk

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)

Page 257: Introdução à Programação Python e Tk

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)

Page 258: Introdução à Programação Python e Tk

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()

Page 259: Introdução à Programação Python e Tk

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)

Page 260: Introdução à Programação Python e Tk

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()

Page 261: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 261

Page 262: Introdução à Programação Python e Tk

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.

Page 263: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 263

8.2.30 Definindo um Widget “Custom”

• Exemplo: um novo botao OK;

• Usar Canvas.

Page 264: Introdução à Programação Python e Tk

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()

Page 265: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 265

Page 266: Introdução à Programação Python e Tk

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.

Page 267: Introdução à Programação Python e Tk

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.

Page 268: Introdução à Programação Python e Tk

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().

Page 269: Introdução à Programação Python e Tk

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.

Page 270: Introdução à Programação Python e Tk

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()

Page 271: Introdução à Programação Python e Tk

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)

Page 272: Introdução à Programação Python e Tk

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.

Page 273: Introdução à Programação Python e Tk

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

Page 274: Introdução à Programação Python e Tk

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).

Page 275: Introdução à Programação Python e Tk

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).

Page 276: Introdução à Programação Python e Tk

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)

Page 277: Introdução à Programação Python e Tk

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)

Page 278: Introdução à Programação Python e Tk

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)

Page 279: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 279

8.2.41 Exemplo: Dialogo para Abrir/Salvar Arquivo

Aparencia do dialogo:

Page 280: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 280

Uso da classe MyFileDialog:

import MyFileDialog

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

filename = d.Get_Output()

Page 281: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 281

Modulos importados pela classe:

from Tkinter import *

import os, os.path, string

Page 282: Introdução à Programação Python e Tk

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()

Page 283: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 283

Outros metodos da classe MyFileDialog:

def null(self):

pass

def Get_Output(self):

return (self.output)

Page 284: Introdução à Programação Python e Tk

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)

Page 285: Introdução à Programação Python e Tk

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)

Page 286: Introdução à Programação Python e Tk

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()

Page 287: Introdução à Programação Python e Tk

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)

Page 288: Introdução à Programação Python e Tk

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)

Page 289: Introdução à Programação Python e Tk

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()

Page 290: Introdução à Programação Python e Tk

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

Page 291: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 291

def Cancel(self):

"Handler for Cancel button"

self.output = ""

self.top.destroy()

Page 292: Introdução à Programação Python e Tk

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

Page 293: Introdução à Programação Python e Tk

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);

Page 294: Introdução à Programação Python e Tk

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.

Page 295: Introdução à Programação Python e Tk

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.

Page 296: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 296

Metodos do widget:

.delete() Apagar texto;

.get() Obter texto;

.insert() Inserir texto;

.search() Procurar um padrao.

Page 297: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 297

8.2.43 Exemplo: Editor ASCII

Aparencia do programa:

Page 298: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 298

Menus do programa:

Page 299: Introdução à Programação Python e Tk

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

# [email protected]

# 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:

Page 300: Introdução à Programação Python e Tk

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")

Page 301: Introdução à Programação Python e Tk

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")

Page 302: Introdução à Programação Python e Tk

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

Page 303: Introdução à Programação Python e Tk

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:

Page 304: Introdução à Programação Python e Tk

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()

Page 305: Introdução à Programação Python e Tk

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")

Page 306: Introdução à Programação Python e Tk

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()

Page 307: Introdução à Programação Python e Tk

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")

Page 308: Introdução à Programação Python e Tk

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

Page 309: Introdução à Programação Python e Tk

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)

Page 310: Introdução à Programação Python e Tk

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()

Page 311: Introdução à Programação Python e Tk

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;

Page 312: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 312

8.4 Programacao Visual com Tk

VTCL Programacao visual em Tcl/Tk; Home page:

http://vtcl.sourceforge.net.

Page 313: Introdução à Programação Python e Tk

8 PROGRAMACAO GRAFICA USANDO TK 313