Introdução à Programação em Python e TK | Carlos A P Campani ...

November 29, 2017 | Author: Anonymous | Category: Python
Share Embed


Short Description

[3] Lundh, Fredrik An Introduction to Tkinter, 1999. http://www.pythonware.com/library/tkinter/ an-introduction-to-tkint...

Description

1

Introdu¸c˜ ao ` a Programa¸c˜ ao em Python e Tk Carlos A. P. Campani 22 de abril de 2005

2

c Copyright °2005 Carlos A. P. Campani. ´ garantida a permiss˜ao para copiar, distribuir e/ou E modificar este documento sob os termos da Licen¸ca de Documenta¸ca˜o Livre GNU (GNU Free Documentation License), Vers˜ao 1.2 ou qualquer vers˜ao posterior publicada pela Free Software Foundation; sem Se¸co˜es Invariantes, Textos de Capa Frontal, e sem Textos de Quarta Capa. Uma c´opia da licen¸ca ´e inclu´ıda na se¸ca˜o intitulada ”GNU Free Documentation License”. veja: http://www.ic.unicamp.br/~norton/fdl.html.

ˆ REFERENCIAS

Referˆ encias [1] Catunda, Marco Python: guia de consulta r´apida, 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

3

ˆ REFERENCIAS

Links (Python Language Website) http://www.python.org (Python Resources) http://www.vex.net/parnassus/ (Tcl/Tk Site) http://www.tcl.tk

4

ˆ REFERENCIAS

Material do Curso (Lˆaminas do curso) http://www.ufpel.tche.br/~campani/laminas.pdf (Lˆaminas para Impress˜ao) 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

5

ˆ REFERENCIAS

Programas • Python 2.1; • Tk 8; • Python-tkinter 2.1; • vi; • emacs; • gnuplot e m´odulo Gnuplot;

6

ˆ REFERENCIAS

• Numeric 2.0; • MySQL 3; • Python-MySQLdb; • XFreeGL (OpenGL)/ Mesa3D; • PyOpenGL 2. • PIL 1.1.5

7

ˆ REFERENCIAS

Obtendo os Programas • Pacotes rpm ou tarball; • Bin´ario (pr´e-compilado) ou source (tem que compilar); • P´aginas oficiais dos programas; • Distribui¸c˜ oes Linux; • http://rpmfind.net; • http://sourceforge.net.

8

ˆ REFERENCIAS

Instalando os Programas em Linux Instalando pacotes rpm: $ su % rpm -i % ^D $ Compilando o fonte: $ su % cd % ./configure % ./make % ./make install

9

1

OBJETIVOS DO CURSO

1

Objetivos do Curso

• Introduzir a linguagem Python para alunos que j´a saibam programar; • Mostrar, de forma introdut´oria, aspectos avan¸cados de Python, tais como scripts para web, acesso a MySQL, suporte a audio e OpenGL; • Introduzir o toolkit Tk e mostrar como desenvolver rapidamente aplica¸c˜oes baseadas em janelas usando-o.

10

2

CARACTER´ISTICAS DE PYTHON

2

Caracter´ısticas de Python

• Criada por Guido van Rossum em 1991; • Evolu¸ca˜o do C • Linguagem de script e linguagem de programa¸ca˜o; – Exemplos de linguagens de script: Tcl, Perl, etc. – Objetivo: substituir C e Java; • Interpretada e interativa; • Multiplataforma: Unices, Windows e Mac (no Linux ´e pr´e-instalado); • Possui suporte a POO;

11

2

CARACTER´ISTICAS DE PYTHON

• Estruturas de controle e de dados avan¸cadas (mais poderosas que C e Java); – Lista encadeada e tabela hash como primitivas da linguagem; – Tratamento de erros de execu¸c˜ao; • Dispensa BEGIN e END (obriga a endenta¸ca˜o e a estrutura¸c˜ao do programa); • Tipagem dinˆamica (n˜ao ´e necess´ario declarar vari´aveis); • Combinados, os u ´ltimos trˆes itens significam que os programas em Python s˜ao muito menores e mais “limpos” que os equivalentes em C e Java;

12

2

CARACTER´ISTICAS DE PYTHON

• Mais verifica¸c˜oes de erros de sintaxe/execu¸ca˜o que C; • Modular (organiza o namespace); from Tkinter import * root = Tk() ou import Tkinter root = Tkinter.Tk() • Ideal para prototipa¸ca˜o r´apida de aplica¸co˜es; • Gr´aficos em janelas usando-se m´odulo Tkinter; • Pode ser extendida usando-se C e C++ (escrevendo-se novos m´odulos);

13

2

CARACTER´ISTICAS DE PYTHON

• Profiling; • Programa¸c˜ao cient´ıfica (NumPy e Gnuplot); • Computa¸c˜ao gr´afica (PyOpenGL); • Acesso ao servidor MySQL (Python-MySQLdb); • Linguagem de Cola (glue language); Exemplo: vocˆe pode usar em FORTRAN aquele pacote gr´afico que s´o funciona em C; • Scripts CGI (usando-se m´odulo CGI); ´ software livre! • Finalmente: E

14

3

´ TEORIA VERSUS PRATICA

3

Teoria Versus Pr´ atica

• “Aprender a sintaxe de uma linguagem n˜ao ´e tudo”; • Metodologia de desenvolvimento de software; – M´etodos sistem´aticos; – Redu¸ca˜o de problemas; – Herdar resultados; – Semˆantica formal; • Teoria e pr´atica andam juntas.

15

4

USANDO O INTERPRETADOR

4 4.1

Usando o Interpretador 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. >>>

16

4

USANDO O INTERPRETADOR

Control-D abandona o interpretador. >>> ^D $

17

4

USANDO O INTERPRETADOR

>>> 2+2 4 >>> 2+ File "", line 1 2+ ^ SyntaxError: invalid syntax >>> # Este ´ e um coment´ ario ... 2*2 4 >>> 7/3 2 >>> 7./3. 2.3333333333333335 Observe o prompt secund´ario ...

18

4

USANDO O INTERPRETADOR

>>> 1/0 Traceback (most recent call last): File "", 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. >>>

19

4

USANDO O INTERPRETADOR

Aten¸c˜ao! • Atribui¸ca˜o: =; • Igualdade: ==. (inspirado em C)

20

4

USANDO O INTERPRETADOR

>>> >>> 10 >>> >>> 11 >>> >>> >>> 0 >>> 11 >>> 0

a = 10 a a += 1 a b = c = 0 a,b = b,a a b c

21

4

USANDO O INTERPRETADOR

>>> x = 15 >>> x 15 >>> x = 3.1415 >>> x 3.1415000000000002 Lembre-se: Tipagem dinˆamica!

22

4

USANDO O INTERPRETADOR

>>> print "Ol´ a, mundo!" Ol´ a, 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

23

4

USANDO O INTERPRETADOR

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

24

4

USANDO O INTERPRETADOR

>>> if 1: print "verdadeiro" ... verdadeiro >>> if 0: print "verdadeiro" ... >>> Observa¸c˜oes: • Valores-verdade: 0 e 1; • ... ´e o prompt secund´ario.

25

4

USANDO O INTERPRETADOR

>>> if x>>

x, "menor" x, "maior"

Observa¸c˜oes: • Observe o prompt secund´ario ao final da estrutura; • N˜ao misturar espa¸cos e tabula¸co˜es em um mesmo bloco (erro!).

26

4

USANDO O INTERPRETADOR

Tupla: >>> >>> 1 >>> 2 >>> 3 >>> 2 >>>

x=(1,2,3) x[0] x[1] x[-1] x[-2]

27

4

USANDO O INTERPRETADOR

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]

28

4

USANDO O INTERPRETADOR

>>> x [10,2,3,1000] >>>

29

4

USANDO O INTERPRETADOR

String: >>> x = "Gr^ emio FBPA" >>> y = " - o maior de todos" >>> print x+y Gr^ emio FBPA - o maior de todos Fun¸c˜ao: >>> x = float >>> x >>> x(2) 2.0

30

4

USANDO O INTERPRETADOR

Binding: amarra¸ca˜o entre nomes e valores em um namespace. Sempre que ocorre uma atribui¸c˜ao, ocorre uma amarra¸ca˜o entre vari´avel e valor. >>> a = a+1 A ocorrˆencia de a a esquerda da atribui¸ca˜o ´e uma referˆencia ao objeto (L-value). Observe que tudo em Python s˜ao objetos, inclusive n´ umeros. A ocorrˆencia de a a direita da atribui¸c˜ao (R-value) deve ser de-referenciada.

31

4

USANDO O INTERPRETADOR

32

Valor 15

X

Namespace “Tipo do valor e n˜ao tipo da vari´avel (nome)”.

4

USANDO O INTERPRETADOR

>>> >>> >>> 1 >>> 1 >>> >>> >>> 1 >>> 0 >>> >>> 1 >>> 1

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

# sim, pois n´ umeros iguais sempre s~ ao o mesmo objeto

x = [1,2] y = [1,2] print x==y # sim, pois s~ ao iguais print x is y # n~ ao, pois s~ ao objetos (estruturas) diferentes x = y = [1,2] print x==y # sim, pois s~ ao iguais print x is y # sim, pois s~ ao o mesmo objeto (mesma estrutura)

33

4

USANDO O INTERPRETADOR

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

34

4

USANDO O INTERPRETADOR

4.2 4.2.1

Usando o Interpretador - Modo Programado Exemplo: Programa Ol´ a, mundo

$ vi teste.py #!/usr/bin/python print "Ol´ a, mundo!" :wq $ python teste.py Ol´ a, mundo! $ chmod a+x teste.py $ ./teste.py Ol´ a, mundo! $

35

4

USANDO O INTERPRETADOR

4.2.2

Editando os Programas

´ encontrado em qualquer sistema Unix; reconhece programas vi E Python e fornece alguma ajuda atrav´es de cores nos comandos;

36

4

USANDO O INTERPRETADOR

37

4

USANDO O INTERPRETADOR

emacs Editor encontrado em qualquer instala¸c˜ao Linux; reconhece programas Python e permite executar o programa dentro do pr´oprio editor.

38

4

USANDO O INTERPRETADOR

39

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

5 5.1

Programa¸c˜ ao B´ asica Python Identificadores

Exemplos: x, a10, carlos campani Observa¸c˜ao: x 6= X

40

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

5.2

N´ umeros

Decimal: 15 Hexadecimal: 0x1f Octal: 020 Inteiro longo: 15L, 0x1fL, 020L Ponto flutuante: 327.2, 0., .33333, 2.01e-10 Complexos: 3+2j

41

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

>>> a = 3+2j >>> b = complex(1,0) >>> print a+b (4+2j) >>> a.real 3.0 >>> a.imag 2.0 >>>

42

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

5.3

Strings

>>> print ’ol´ a’ ol´ a >>> 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! >>>

43

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

44

Caracteres de escape: Escape

Significado

\"

aspas

\n

nova linha

\

ASCII caracter octal

\x

ASCII caracter hexadecimal

\u

Unicode

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Para n˜ ao considerar os caracteres de escape use “r” antes da string: >>> print "Primeiro\nSegundo" Primeiro Segundo >>> print r"Primeiro\nSegundo" Primeiro\nSegundo Suporte ao padr˜ ao Unicode: >>> print u"Ol´ a, mundo!" Ol´ a, mundo!

45

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Algumas opera¸co ˜es sobre strings: >>> print "Ol´ a, "+"mundo" # concatena¸ c~ ao Ol´ a, mundo >>> print "Python"*2 # repeti¸ c~ ao PythonPython >>> print "Python"[0] # indexa¸ c~ ao P >>> print "Python"[-2] # indexa¸ c~ ao para tr´ as o >>> print "Python"[1:4] # particionar yth

46

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

5.4

47

Operadores

• Operadores aritm´eticos: Operador

Descri¸ca˜o

+

adi¸ca˜o

-

subtra¸c˜ao

*

multiplica¸ca˜o

/

divis˜ao

%

resto da divis˜ao

**

exponencia¸ca˜o

x = x+y pode ser substituido por x += y. Isto funciona para todos os operadores aritm´eticos.

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

48

• Operadores l´ogicos: Operador

Descri¸ca˜o

and

e l´ogico

or

ou l´ogico

not

nega¸ca˜o

S˜ao considerados valores falsos em Python: None, 0, 0.0, () ou [] (seq¨ uˆencia vazia) e {} (dicion´ario vazio). Todo o resto ´e considerado verdadeiro.

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

49

• Compara¸c˜oes: Operador

Descri¸ca˜o

>

maior

<

menor

==

igual

>=

maior ou igual

>> if ’a’ in [’a’,’b’,’c’]: ... print "contido" ... contido

50

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

51

• Operadores de bits: Operador

Descri¸ca˜o

|

ou

^

ou exclusivo

&

e

>

desloca para a direita

~

nega¸ca˜o

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Exemplos: >>> 7 >>> 0 >>> 8 >>> 16 >>> -4

3 | 4 3 & 4 4 > 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]

55

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

No particionamento os valores default s˜ao o primeiro elemento e o u ´ltimo respectivamente, de forma que a[:] ´e uma parti¸c˜ao idˆentica a lista original (foi feita apenas uma c´opia). >>> a = b = [1,2,3] >>> c = a[:] >>> a[0] = 15 >>> a [15,2,3] >>> b [15,2,3] >>> c [1,2,3]

56

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

57

Opera¸c˜oes com listas: Operador

Descri¸c˜ao

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

substitui¸ca˜o

del s[i:j]

remove elementos

s.append(x)

adiciona elemento

s1.extend(s2)

adiciona lista

s.count(x)

conta n´ umero de ocorrˆencias

s.index(x)

menor ´ındice de x

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

58

Opera¸c˜oes com listas (continua¸c˜ao) s.insert(i,x)

insere na posi¸c˜ao i

s.pop(i) ou s.pop()

retira elemento (default=−1)

s.remove(x)

remove elemento x

s.reverse()

reverte a lista

s.sort()

ordena lista

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

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]

59

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

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]

60

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Implementando CAR e CDR: >>> s=[1,2,3] >>> s[0] # CAR 1 >>> s[1:] # CDR [2,3]

61

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

• Dicion´arios: S˜ao conjuntos de pares chave-valor; Exemplos: >>> x={’Carlos’ : ’15-11-1962’,\ ’Fantomas’ : ’15-11-1960’} >>> x[’Carlos’] ’15-11-1962’

62

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

63

Opera¸c˜oes com dicion´arios: len(d)

tamanho do dicion´ario

d[k]

valor da chave k

d[k]=x

atribui¸ca˜o

del d[k]

remove par chave-valor

d.clear()

apaga todos os elementos

d.copy()

retorna c´opia do dicion´ario

d.has_key(k)

verdadeiro se a chave existe

d.items()

retorna lista de todos os elementos

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

64

Opera¸c˜oes com dicion´arios (continua¸ca˜o) d.keys()

lista de todas as chaves

d1.update(d2)

atualiza todas as chaves

d.values()

lista de todos os valores

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Exemplo: >>> x[’Fantomas’] = ’10-11-1960’ >>> x.items() [(’Carlos’,’15-11-1962’),(’Fantomas’, ’10-11-1960’)] >>> x.has_key(’Carlos’) 1

65

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

5.6

´ Algumas Fun¸c˜ oes Uteis

abs(n) Valor absoluto; apply(fun¸c˜ ao,args) Chama uma fun¸c˜ao com seus argumentos; Exemplo: >>> def soma(x,y): ... return x+y ... >>> apply(soma,[3,4]) 7 complex(r,i) Cria um n´ umero complexo;

66

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

eval(e) Avalia uma express˜ao; 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;

67

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

list(s) Retorna uma lista contendo os elementos de uma seq¨ uˆencia; Exemplo: >>> list("abc") [’a’,’b’,’c’] >>> list((1,2,3)) [1,2,3] long(x) Converte para inteiro longo; pow(x,y) Calcula xy ;

68

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

range Retorna uma lista contendo uma seq¨ uˆencia de n´ umeros; 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]

69

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

raw input(s) Leitura da entrada padr˜ao (n˜ao formata); Exemplo: >>> x = raw_input("x=") x=15 >>> print x 15 >>> y = raw_input() 2003 >>> print y 2003

70

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

str(x) Converte para string; tuple(s) Converte uma seq¨ uˆencia para uma tupla; Exemplo: >>> tuple("abc") (’a’,’b’,’c’)

71

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

5.7 5.7.1

Estruturas de Controle if

if x>0: print "maior que zero"

72

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

if a>b: print a else: print b Observe endenta¸ca˜o (com brancos ou tabula¸c˜oes, mas sempre coerente).

73

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Substitui o case/switch. if x1: fat = n*fat n -= 1 print fat Exemplo (Fibonacci): a,b = 0,1 while b>> for i in [1,2,3,4,5]: ... print i ... 1 2 3 4 5 >>>

76

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

>>> for i in range(1,6): ... print i ... 1 2 3 4 5 >>>

77

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

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

78

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Muitas vezes ´e necess´ario modificar a lista que est´a sendo usada no la¸co for, o que ´e perigoso pois pode fazer o la¸co perder-se. Nestes casos usa-se uma c´opia 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’]

79

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Exemplo (sele¸ca˜o 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]

80

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Usando lista para construir uma matriz 3 × 3: >>> >>> ... ... >>> [0, >>> >>> >>> [0,

m = [] for ind in range(0,9): m.append(ind*2) m 2, 4, 6, 8, 10, 12, 14, 16] i,j = 2,3 m[(i-1)*3+j-1] = 7 # matriz[2,3] = 7 m 2, 4, 6, 8, 7, 12, 14, 16]

81

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

5.7.4

break

Interrompe o la¸co mais interior. Exemplo: achou = 0 for i in s: if i == x: achou = 1 break

82

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

5.7.5

continue

Reinicia o la¸co. Exemplo: for i in s[:]: if len(i) > print fat(5) 120

88

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

def fat(x): if x: return x*fat(x-1) else: return 1 Observe a utilidade do valor-verdade falso poder ser 0.

89

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

def count(s): # retorna tamanho da seq¨ ue ^ncia if s: return count(s[1:])+1 else: return 0 Observe a utilidade do valor-verdade falso poder ser [], () ou "": podemos usar esta fun¸ca˜o com lista, tupla ou string.

90

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Em Python n˜ao existem procedimentos, s´o fun¸co˜es. Se a fun¸ca˜o n˜ao retorna nada n˜ao ´e necess´ario void. def ola(): print "Ol´ a, mundo" >>> ola() Ol´ a, mundo

91

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Para declarar uma vari´avel como global use a declara¸c˜ao global. Exemplo: def teste(): global x x = 15

92

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Podemos definir valores default para os argumentos de uma fun¸ca˜o: >>> 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

93

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Valores default s˜ao avaliados dentro do escopo de defini¸ca˜o e n˜ao dinamicamente: >>> >>> ... ... >>> >>> 15

i = 15 def teste(a=i): print a i = 10 teste()

94

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Podemos definir fun¸c˜oes com um n´ umero arbitr´ario de argumentos (argumentos excedentes ser˜ao transformados em uma tupla): def fprintf(f,formato,*args): f.write(formato % args)

95

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Passagem de Parˆametros: ´ o casamento entre parˆametros reais e parˆametros • E formais; • Tipos de Passagem de Parˆametros: – Tipo Entrada. Ex: PASCAL (Passagem por Valor – padr˜ao); – Tipo Entrada-Sa´ıda. Ex: PASCAL (Passagem por Referˆencia – VAR); – Tipo Sa´ıda (raro). Ex: Passagem por Resultado; – Em Python todos os argumentos s˜ao passados por referˆencia a objeto (c´opia da referˆencia).

96

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Para declarar fun¸c˜oes anˆonimas, Python usa nota¸c˜ao lambda: >>> f = lambda x,y : x+y >>> print f(10,15) 25

97

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Para documentar as fun¸c˜oes use strings de documenta¸c˜ao. def ola(): " Esta fun¸ ca ~o ´ e um exemplo " pass

98

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

5.10

Programa¸c˜ ao Funcional

Listas+CAR+CDR+Fun¸co˜es Anˆonimas=Programa¸ca˜o Funcional

99

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

5.11

Manipula¸c˜ ao 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().

100

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

Exemplo: >>> f = open("teste.txt","r") >>> x = f.read() >>> f.close()

101

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

5.12

Alguns M´ odulos do Python

• Extendem as capacidades do interpretador; • Organizam o namespace; • Podemos definir novos m´odulos em C ou Python, ou importar m´odulos feitos por outros.

102

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

sys Acesso `as fun¸c˜oes do sistema; Exemplo: #!/usr/bin/python import sys print sys.argv $ ./teste.py a b c [’teste.py’,’a’,’b’,’c’]

103

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

pickle Convers˜ao 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() >>>

104

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

105

string Tratamento de strings; >>> import string >>> string.atoi("15") 15 >>> string.strip(" Como vai? ’Como vai?’ >>>

")

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

re Trata express˜oes regulares; math Fun¸c˜oes matem´aticas; >>> import math >>> print math.sin(.5) 0.479425538604 random Gera¸c˜ao de n´ umeros aleat´orios; Exemplo: >>> import random >>> print random.random() 0.466429115742

106

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

calendar Calend´ario perp´etuo; 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

107

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

108

os Relacionado ao sistema operacional; Exemplo: >>> import os >>> os.system("ls -l") total 3 drwxrwxr-x 2 carlos carlos drwxrwxr-x 2 carlos carlos drwxrwxr-x 2 carlos carlos 0 >>>

4096 Aug 25 20:39 Mail 4096 Feb 17 11:56 docs 4096 Feb 17 21:46 tmp

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

os.path Trata caminhos de diret´orios; Exemplo: >>> import os.path >>> print os.path.abspath(".") /home/carlos Tkinter Acesso ao Tk; signal Intercepta¸ca˜o de eventos ass´ıncronos; sockets Interface de rede; thread Cria¸c˜ao de threads;

109

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

gzip Compress˜ao e descompress˜ao gzip; readline GNU readline; zipfile Manuseio de arquivos zip.

110

5

˜ BASICA ´ PROGRAMAC ¸ AO PYTHON

5.13

Pydoc

Completa documenta¸ca˜o dos m´odulos do Python ao estilo das man pages do Unix. $ pydoc sys

111

6

˜ ORIENTADA A OBJETOS PROGRAMAC ¸ AO

6

6.1

Programa¸c˜ ao Orientada a Objetos Conceitos B´ asicos

• A POO surgiu na ´area de simula¸ca˜o de sistemas e interfaces gr´aficas; • Simula e Smalltalk; • Facilita a programa¸c˜ao ao fornecer um mecanismo de abstra¸c˜ao de dados que estimula o reuso de c´odigo e disciplina os programadores a usar de forma correta o c´odigo que ser´a reusado.

112

6

˜ ORIENTADA A OBJETOS PROGRAMAC ¸ AO

Objeto Uma unidade contendo dados e m´etodos para manipular estes dados; Classe Um molde para cria¸c˜ao de objetos; Encapsulamento Os dados e m´etodos que manipulam estes dados est˜ao definidos dentro de uma unidade de c´odigo que esconde os detalhes de implementa¸ca˜o (abstra¸c˜ao), permitindo que o programador acesse o c´odigo atrav´es de uma interface p´ ublica (ao contr´ario da implementa¸c˜ao que ´e privada); Heran¸ca Permite o reuso de c´odigo atrav´es de um mecanismo de classes e subclasses que s˜ao herdadas das primeiras, criando uma hierarquia;

113

6

˜ ORIENTADA A OBJETOS PROGRAMAC ¸ AO

Mensagens As chamadas aos m´etodos s˜ao entendidas como envio de mensagens para os objetos (toda a computa¸c˜ao de um programa ´e entendida como uma seq¨ uˆencia 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 est´a sendo usado); Instancia¸c˜ ao Criar um objeto a partir de uma classe.

114

6

˜ ORIENTADA A OBJETOS PROGRAMAC ¸ AO

6.2

Programa¸ c˜ ao Orientada a Objetos em Python

• Definindo classes em Python Sem heran¸ca: class nome: bloco Heran¸ca simples: class nome(classe-pai): bloco Heran¸ca m´ ultipla (quando existe mais de uma classe-pai): class nome(classe-pai-1,classe-pai-2,...): bloco • Definindo m´ etodos da classe: usa-se def. • Em Python, podemos documentar as classes usando strings de documenta¸c˜ ao.

115

6

˜ ORIENTADA A OBJETOS PROGRAMAC ¸ AO

• 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]) • Observa¸co ˜es: – self ´ e o pr´ oprio objeto; –

init

´ e o contrutor da classe;



repr

´ e a rotina de impress˜ ao.

116

6

˜ ORIENTADA A OBJETOS PROGRAMAC ¸ AO

• Instanciando: >>> atomo >>> print NumAtom=2 >>> print He >>>

= atomo(2,0,1,0) atomo X=0 Y=1 Z=0 atomo.simbolo()

117

6

˜ ORIENTADA A OBJETOS PROGRAMAC ¸ AO

• Polimorfismo: >>> class A: ... def get(self): ... print "Ol´ a, mundo" ... >>> class B: ... def get(self): ... print "Python" ... >>> a = A() >>> b = B() >>> a.get() Ol´ a, mundo >>> b.get() Python a e b s˜ ao objetos diferentes e a mensagem .get() reage de forma diferente em cada um.

118

6

˜ ORIENTADA A OBJETOS PROGRAMAC ¸ AO

• Observa¸ca ˜o: 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 p´ ublico def impx(self): print self.__x >>> e = esconde(10,15) >>> print e.y 15 >>> e.impx() 10 • M´ etodo privado: class teste: def __secreto(self): # m´ etodo privado ...

119

6

˜ ORIENTADA A OBJETOS PROGRAMAC ¸ AO

• 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("Mol´ ecula de Hidrog^ enio (H2)") h2.adicatomo(hidro1) h2.adicatomo(hidro2)

120

6

˜ ORIENTADA A OBJETOS PROGRAMAC ¸ AO

• 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) • Observa¸co ˜es: – class substancia(molecula): indica que substancia est´ a sendo herdada de molecula (molecula ´ e a superclasse, substancia ´ e a subclasse); – molecula. init (self,nome) significa a chamada do m´ etodo construtor pai; – J´ a

repr

foi totalmente reescrito.

121

6

˜ ORIENTADA A OBJETOS PROGRAMAC ¸ AO

• Atributo de classe e de instˆ ancia: class teste: x = 10 # atributo global (de classe) def __init__(self,n): self.y = n # atributo de inst^ ancia ...

122

6

˜ ORIENTADA A OBJETOS PROGRAMAC ¸ AO

• Outro exemplo de heran¸ca: 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))

123

6

˜ ORIENTADA A OBJETOS PROGRAMAC ¸ AO

124

Alimento N

ss s s ss s s sy s

Leite

NNN NNN NNN N&

Sucrilhos

7

PYTHON AVANC ¸ ADO

7 7.1

Python Avan¸cado M´ odulo Gnuplot - Programa¸c˜ ao Cient´ıfica

• M´odulo para acessar o programa externo gnuplot; • Home page: http://gnuplot-py.sourceforge.net.

125

7

PYTHON AVANC ¸ ADO

import Gnuplot,math x=[] i=0.0 while i> 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.]]

131

7

PYTHON AVANC ¸ ADO

>>> print a.shape (3,3) >>> reshape(a,(9,)) >>> print a [0.,0.,0.,0.,0.,0.,0.,0.,0.]

132

7

PYTHON AVANC ¸ ADO

Determinante: >>> a = ones((2,2),Float) >>> a = a*10 >>> print a [[10.,10.], [10.,10.]] >>> print determinant(a) 0.0

133

7

PYTHON AVANC ¸ ADO

Autovalores, autovetores e diagonaliza¸ca˜o: >>> 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

134

7

PYTHON AVANC ¸ ADO

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

135

7

PYTHON AVANC ¸ ADO

136

Multiplica¸ca˜o de matrizes: >>> x = matrixmultiply(matrixmultiply(vet,dia),q1) >>> print x [[ -6.93618340e-17 1.00000000e-00] [ 5.00000000e-01 5.00000000e-01]]

7

PYTHON AVANC ¸ ADO

7.3

Internacionaliza¸c˜ ao

• M´odulo gettext; • Acesso `a API GNU-gettext; • Permite que as mensagens do aplicativo sejam escritas em diversas l´ınguas, de forma que o usu´ario possa escolher a l´ıngua que deseja.

137

7

PYTHON AVANC ¸ ADO

7.4

Extendendo Python usando C e C++

• Escrevendo m´odulos em C ou C++; • Partes do programa C: 1. Defini¸ca˜o das fun¸co˜es C; 2. Tabela de m´etodos; 3. Fun¸c˜ao de inicializa¸c˜ao. • Todos os objetos Python tem py_ na frente; • PyArg Parse traduz de Python para C; • Py BuildValue traduz de C para Python.

138

7

PYTHON AVANC ¸ ADO

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

139

7

PYTHON AVANC ¸ ADO

void initSomalib() { (void) Py_InitModule("Somalib", Somalib_methods); }

140

7

PYTHON AVANC ¸ ADO

Como compilar: cc -I/usr/include/python2.1 -c Somalib.c cc -shared Somalib.o -o Somalib.so

141

7

PYTHON AVANC ¸ ADO

Como Python encontra os m´odulos? • PYTHONPATH; • Diret´orio corrente; • /usr/lib/python2.1/site-packages.

142

7

PYTHON AVANC ¸ ADO

Como usar: >>> import Somalib >>> Somalib.soma(10,20) 30 ou >>> from Somalib import * >>> soma(10,20) 30

143

7

PYTHON AVANC ¸ ADO

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

144

7

PYTHON AVANC ¸ ADO

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

145

7

PYTHON AVANC ¸ ADO

static PyMethodDef TrataString_methods[]={ {"Tamanho",py_Tamanho,METH_VARARGS}, {"Imprime",py_Imprime,METH_VARARGS}, {NULL,NULL} }; void initTrataString() { (void) Py_InitModule("TrataString", TrataString_methods); }

146

7

PYTHON AVANC ¸ ADO

Para retornar None: Py_INCREF(Py_None) return Py_None

147

7

PYTHON AVANC ¸ ADO

7.5

Comunica¸c˜ ao com Programas em Outras Linguagens (C, FORTRAN, LISP, PROLOG, etc.)

• Todo programa pode comunicar-se com Python pelo dispositivo de entrada/sa´ıda padr˜ao; • Usa-se popen ou popen2 para abrir um pipe com o programa.

148

7

PYTHON AVANC ¸ ADO

#include "stdio.h" main() { int x; scanf("%d",&x); printf("%d",x*2); }

$ gcc -o teste.o teste.c

149

7

PYTHON AVANC ¸ ADO

>>> >>> >>> >>> >>>

import os f = os.popen("./teste.o","w") f.write("15") f.flush() f.close()

150

7

PYTHON AVANC ¸ ADO

7.6

Profiling

Permite determinar que partes do programa s˜ao “gargalos” de tempo e devem ser convertidas para C, aumentando o desempenho do programa de forma mais eficiente.

151

7

PYTHON AVANC ¸ ADO

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>> import Image >>> imagem = Image.open("darthmaul2.jpg") >>> print imagem.format, imagem.size, imagem.mode JPEG (1024, 768) RGB >>> imagem.save("darth.gif")

161

7

PYTHON AVANC ¸ ADO

7.9

Usando MySQL

• M´odulo Python-MySQLdb; • Vocˆe precisa de acesso ao servidor MySQL (senha).

162

7

PYTHON AVANC ¸ ADO

163

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

Data de nascimento

Hamster

2003-01-01

Rintintin

1950-11-15

Acar´a

1994-11-15

7

PYTHON AVANC ¸ ADO

>>> import MySQLdb >>> con=MySQLdb.Connection(user="root",passwd=\ ,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’")

164

7

PYTHON AVANC ¸ ADO

>>> print curs.fetchall() ((’Hamster’,),) >>> curs.close() >>> con.close()

165

7

PYTHON AVANC ¸ ADO

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 gr´afico maravilhoso, que s´o funciona com C, em um programa FORTRAN, ou ent˜ao desenhar uma interface gr´afica usando Tk para um programa PROLOG (que originalmente n˜ao possui suporte para Tk);

166

7

PYTHON AVANC ¸ ADO

• Um m´odulo que permite Python comunicar-se com outro programa ´e chamado de wrapper ; • Podemos usar o swig (http://www.swig.org) para fazer wrappers.

167

7

PYTHON AVANC ¸ ADO

7.11

Scripts CGI

• Primeiro instalar o servidor Apache corretamente; • Colocar os scripts no diret´orio cgi-bin criado na instala¸c˜ao do servidor; • Dar previl´egio de execu¸ca˜o para o script; • Dois tipos de forms: POST e GET.

168

7

PYTHON AVANC ¸ ADO

7.11.1

Exemplo: Ol´ a, mundo

#!/usr/bin/python import cgi print "Content-Type: text/html" print print "CGI teste" print "Teste" print "Ol´ a, mundo!"

169

7

PYTHON AVANC ¸ ADO 7.11.2

Exemplo: Formul´ ario

Teste Enquete Sua prefer^ encia de compra: Selecione um Carro Casa Sal´ ario:

170

7

PYTHON AVANC ¸ ADO

Sexo: Homem Mulher

171

7

PYTHON AVANC ¸ ADO #!/usr/bin/python import cgi print "Content-Type: text/html" print print "CGI teste" form=cgi.FieldStorage() Prefere=form.getvalue("Prefere") Valor=form.getvalue("Valor") Sexo=form.getvalue("Sexo") if Prefere=="0": Preferencia="" elif Prefere=="1": Preferencia="Carro" else: Preferencia="Casa" print "Prefer^ encia: %s"%(Preferencia) print "Valor: %s"%(Valor) print "Sexo: %s"%(Sexo)

172

7

PYTHON AVANC ¸ ADO

173

Curiosidade: http://www.google.com GOOGLE=Linux+Python+MySQL

7

PYTHON AVANC ¸ ADO

7.12

Suporte a Som

M´odulos 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()

174

7

PYTHON AVANC ¸ ADO

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

175

7

PYTHON AVANC ¸ ADO

7.13

´ Processamento de Audio Ecasound

Processamento de ´audio em Python/Linux. http://www.eca.cx/ecasound/

176

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8

Programa¸c˜ ao Gr´ afica usando Tk

8.1

Introdu¸c˜ ao 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 usu´ario gr´afica;

177

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

• Originalmente projetado para ser usado com Tcl (Toolkit Control Language); • Tcl ´e muito limitado como linguagem; • Pode ser usada tamb´em com Perl e Python; • M´odulo Tkinter: interface Python-Tk - orientado a objetos;

178

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Como funcionam as chamadas do Tkinter? Seu programa P ython ²

T kinter (P ython) ²

tkinter (C) ²

T k widgets (C e T cl) ²

T k (C) ²

Xlib Problema: a necessidade de acessar Tcl.

179

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2

180

Usando o Tkinter

• Tkinter ´e um wrapper para acessar Tk a partir de Python; • Um wrapper ´e como uma camada que faz a comunica¸ca˜o de duas outras.

Tk Tkinter Python

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.1

Alguns Widgets do Tk

Label Exibe texto n˜ao formatado; Button Bot˜ao (pode-se associar o clique do mouse com um “callback”); Frame Container retangular usado para colocar uma hierarquia de widgets filhos (n˜ao aparece na tela); Text Texto formatado edit´avel; Listbox Sele¸c˜ao de alternativas;

181

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Canvas Exibe objetos gr´aficos (´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.

182

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.2

Exemplo: Ol´ a, mundo

from Tkinter import * root = Tk() lb = Label(root,text="Ol´ a, mundo!") lb.pack() root.mainloop()

183

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

from Tkinter import * root = Tk() lb = Label(root,text="Ol´ a, mundo!") lb.pack() root.mainloop() Descri¸c˜ ao: root = Tk() root ´ e o handler do widget ra´ız (representa a aplica¸c˜ ao); Tk() ´ eo construtor da aplica¸c˜ ao; Label observe que o construtor Label recebe o handler do root (widget mestre); Label ´ e o widget escravo; text="texto" Op¸ca ˜o indicando o texto a ser exibido dentro do widget; lb Armazena o handler do widget; .pack() M´ etodo para “empacotar” um widget (exibe na tela); ´ o loop do aplicativo (trata todos os eventos). root.mainloop() E

184

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

185

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.3

Exemplo: Ol´ a, mundo 2

from Tkinter import * root = Tk() Label(root,text="Ol´ a, mundo!").pack() root.mainloop() Observe que n˜ao ´e necess´ario armazenar o handler.

186

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.4

Widget Label: Algumas Op¸c˜ oes

O construtor Label, assim como todos os outros m´etodos construtores de widgets, recebe as op¸co˜es na forma chave = valor

187

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

anchor Indica onde o texto ser´a posicionado dentro do widget; Default ´e CENTER; Outros valores s˜ao 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;

188

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

padx Espa¸co extra a direita e a esquerda do widget (em pixels); pady Espa¸co extra acima e abaixo; relief Aparˆencia do widget: FLAT (o default), RIDGE, GROOVE, RAISED, e SUNKEN; text O texto a ser exibido (nova linha com \n); width Largura do widget.

189

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.5

Empacotamento

“Empacotar” significa colocar um widget em uma aplica¸ca˜o (determinar sua posi¸c˜ao em rela¸c˜ao aos outros widgets).

190

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

1. Usando-se .pack() - Cria o layout empacotando widgets dentro de widgets de forma hier´arquica (widgets mestre e escravo), tratando-os como blocos retangulares; Frame Frame

Frame

191

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Algumas op¸co˜es: anchor Posiciona ao empacotar: N, S, W, E, NE, etc. fill Preenche espa¸co 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.

192

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

193

2. Usando-se .grid() - Permite criar layouts baseado em uma grelha bidimensional (como uma tabela); 0

0

1

1

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Algumas op¸co˜es: column Indica a coluna da grelha em que ser´a posicionado o widget (come¸ca em 0); columnspan Caso se queira que o widget ocupe mais de uma coluna (junta c´elulas); row Indica a linha da grelha (come¸ca em 0); rowspan Junta linhas; sticky Determina como o widget vai ocupar uma c´elula da grelha: N, S, W, E, N+S (ocupa todo o espa¸co horizontal), E+W (ocupa todo o espa¸co vertical), N+E+S+W (preenche todo o espa¸co dispon´ıvel).

194

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

3. Usando-se .place() - Permite posicionar explicitamente o widget;

195

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Cuidado! Os empacotadores podem ser usados juntos em uma aplica¸ca˜o, mas n˜ao em um mesmo frame.

196

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.6

Binding e Callback (Handler)

• “Binding” ´e um mecanismo geral para associar uma a¸c˜ao particular do usu´ario (evento) com um comportamento definido espec´ıfico da aplica¸c˜ao; • “Callback” ´e a chamada do handler; • “Handler” ´e a fun¸ca˜o/m´etodo que responde ao evento.

197

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.7

M´ etodos Universais

• S˜ao 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() Destr´oi o widget;

198

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

.event add() Cria eventos virtuais; .grab set() Captura todos os eventos da aplica¸c˜ao; .mainloop() Espera por eventos; .quit() Abandona o “mainloop”.

199

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.8

Exemplo: Ol´ a, mundo 3

from Tkinter import * root = Tk() root.title("Teste") lb = Label(root,text="Ol´ a, mundo!",width=20) lb.pack() root.mainloop() Observa¸c˜ao: width ´e dado em unidades de texto.

200

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

201

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.9

Dimens˜ oes e Sistema de Coordenadas

• Especificar as dimens˜oes em: c (cent´ımetros), i (polegadas), m (milimetros), p (pontos de impress˜ao); • Se n˜ao especifica a dimens˜ao, o valor ´e tomado como pixels; • O sistema de coordenadas ´e relativo ao canto superior esquerdo da janela, “x” refere-se a distˆancias na horizontal e “y” refere-se a distˆancias na vertical.

202

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.10

Exemplo: Ol´ a, mundo 4

from Tkinter import * root = Tk() root.title("Teste") b = Button(root,bg="blue",fg="yellow",text="Ol´ a, mundo!",\ width=20,command=root.quit) b.config(activebackground="yellow") # poderia ser feito na cria¸ c~ ao b.config(activeforeground="blue") b.pack() root.mainloop() Observa¸c˜ oes: • widget “Button” permite criar bot˜ oes clic´ aveis no aplicativo; • “bg” ´ e a cor de fundo e “fg” ´ e a cor do texto; • “command” define uma resposta ao evento “clicar no bot˜ ao”; • “.config” ´ e o m´ etodo para configurar widgets.

203

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

204

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.11

Widget Button

Principais op¸co˜es: activebackground Cor de fundo quando o mouse est´a sobre o widget; activeforeground Cor do texto quando o mouse est´a sobre o widget; anchor Idˆentico a Label; bd Espessura da borda; command Resposta ao clique; cursor Permite definir o cursor quando o mouse est´a sobre o widget;

205

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

justify Idˆentico ao widget Label; padx idem; pady idem; relief idem; text Texto que vai aparecer no bot˜ao; underline Indica a posi¸ca˜o do caracter que ser´a sublinhado no texto do widget e servir´a de atalho do bot˜ao (come¸ca com 0); width Largura do bot˜ao.

206

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 8.2.12

Exemplo: Ol´ a, mundo 5

from Tkinter import * def callback(): print ("Ol´ a, 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” (n˜ ao aparece na tela); • “command=callback” define um callback para o bot˜ ao; • “.pack(side=LEFT)” - packing com posi¸c˜ ao.

207

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

208

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.13

Widget Frame

Algumas op¸co˜es: background (bg) Cor de fundo do frame; borderwidth Espessura da borda (default ´e 0); height Altura do frame; relief Idˆentico ao descrito em Label e Button; width Largura do frame;

209

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.14

Exemplo: Ol´ a, mundo 6

from Tkinter import * def callback(evento): # note o argumento evento do callback print ("Ol´ a, 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("",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 espa¸ co root.mainloop()

210

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

211

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.15

Mais Sobre Binding

• Alguns tipos de eventos: Button O usu´ario pressionou um bot˜ao com o mouse (exemplo: ´e o bot˜ao esquerdo do mouse); Configure O usu´ario 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 usu´ario est´a arrastando o widget;

212

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

• Modificadores de evento: Alt O usu´ario pressionou junto ; Control Pressionou junto ; Double Dois eventos em seq¨ uˆencia (exemplo: );

213

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

• N´ıveis de binding: – Binding de instˆancia - binding de um evento com um widget espec´ıfico; Exemplo: w.bind("",callback); – Binding de classe - binding de todos os widgets da classe; Exemplo: w.bind_class("Canvas","",\ callback); – Binding da aplica¸c˜ao - binding de todos os widgets da aplica¸ca˜o; Exemplo: w.bind_all("",callback);

214

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

• Algumas informa¸co˜es que podem ser passadas para o handler (callback) atrav´es do argumento evento: .widget qual widget gerou o callback; .x coordenada x do evento em rela¸c˜ao ao widget; .y coordenada y do evento em rela¸ca˜o ao widget;

215

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

• Eventos virtuais: w.event_add("","Button-1",\ "Button-2") w.bind("",callback)

216

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.16

Exemplo: Ol´ a, mundo 7

# usando orienta¸ c~ 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="Ol´ a",command=self.Ola) self.ola.pack(side=LEFT) def Ola(self): print "Ol´ a, mundo!" root = Tk() root.title("Teste") ap = Aplic(root) root.mainloop()

217

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

218

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.17

Exemplo: Ol´ a, mundo 8

# usando heran¸ ca 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="Ol´ a",command=self.Ola) self.ola.pack(side=LEFT) def Ola(self): print "Ol´ a, mundo!" root = Tk() root.title("Teste") ap = Aplic(root) root.mainloop()

219

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Observa¸c˜ oes: • No comando class Aplic(Frame), Frame indica a classe-pai; • O comando Frame.__init__(self,mestre), ´ e a chamada do construtor de Frame.

220

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 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)

221

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

222

Layout do teclado: 7

8

9

*

4

5

6

+

1

2

3

-

0 (

/ )

=

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

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)

223

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Binding: b0.bind("",digito) b1.bind("",digito) ... b9.bind("",digito) bmais.bind("",opera) bmenos.bind("",opera) bvezes.bind("",opera) bdiv.bind("",opera) babre.bind("",parenteses) bfecha.bind("",parenteses) bigual.bind("",finaliza) Mainloop: root.mainloop()

224

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

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)

225

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

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)

226

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

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

227

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

228

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 8.2.19

Exemplo: Calend´ ario

from Tkinter import * import time,calendar,tkFont,string root = Tk() root.title("Calend´ ario") frame = Frame(root) frame.pack() ent = Entry(frame) ent.bind("",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()

229

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 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)

230

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

231

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.20

Widget Entry

Algumas op¸co˜es: background (bg) Cor do fundo; borderwidth Espessura da borda; font O fonte que ser´a usado dentro do widget; foreground Cor usada no texto; justify Controla a forma com que o texto ser´a alinhado: LEFT (default), CENTER ou RIGHT; relief A aparˆencia do widget; width Largura do widget (em caracteres de texto).

232

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

M´etodos do widget: .delete(primeiro, u ´ ltimo) Apaga a entrada (exemplo: e.delete(0,END) apaga toda a entrada); .get() Obt´em a entrada (faz a leitura do widget); .insert(´ındice,string) Insere no widget.

233

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

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("",clique) tab=[0,0,0,0,0,0,0,0,0] root.mainloop()

234

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

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)

235

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

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)

236

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

def marcaA(x,y): global tab tab[y*3+x]=1 def marcaB(x,y): global tab tab[y*3+x]=2

237

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

def posicaoy(y): if y 50: conta = 0 diremov=-1*diremov root.after(100,callback)

259

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

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

260

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

261

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.29

Widget PhotoImage

Alguns m´etodos: get(x,y) Obt´em um pixel; put(dados) Escreve dados na imagem; write(filename,op¸co ˜es) Salva imagem em arquivo; zoom(escala) Efetua zoom.

262

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.30

Definindo um Widget “Custom”

• Exemplo: um novo bot˜ao OK; • Usar Canvas.

263

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.31

Exemplo: Usando Menus e Di´ alogos

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

264

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

265

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.32

Widget Menu

Algumas op¸co˜es: background (bg) Cor de fundo; borderwidth (bd) Espessura da borda do menu; font Fonte usada no menu.

266

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

M´etodos 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.

267

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.33

Widget Toplevel

´ uma janela independente de root (n˜ao ´e empacotada). E Algumas op¸co˜es: background Cor de fundo; height Altura da janela (em pixels); width Largura da janela (em pixels). Observa¸c˜ao: Janelas Toplevel (inclusive root) possuem o m´etodo .title().

268

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.34

Definindo uma Janela Transiente e Usando grab set()

• Problema 1: O usu´ario continua com acesso `a janela root; • Problema 2: O usu´ario pode minimizar a janela ou o di´alogo de forma independente; • Solu¸c˜ao do problema 1: .grab set(); • Solu¸c˜ao do problema 2: Janela transiente.

269

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.35

Exemplo: Usando Menus e Di´ alogos 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()

270

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.36

Protocolos

Quando ´e necess´ario interferir na comunica¸ca˜o entre o aplicativo e o gerenciador de janelas. Exemplo: w.protocol("WM DELETE WINDOW",handler)

271

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.37

Esperando uma Janela

• Usa-se o m´etodo .wait window(janela) para aguardar que um determinado widget seja destruido (entra em um la¸co de evento local); • Serve para aguardar que uma janela desapare¸ca da tela.

272

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.38

Widget Listbox

Para apresentar uma lista de alternativas. Sele¸ca˜o 1 Sele¸ca˜o 2 Sele¸ca˜o 3 .. . Sele¸c˜ao n

273

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

lb = Listbox(root) M´etodo .insert() insere no widget. for i in [’1’,’2’,’3’]: lb.insert(END,i) Observa¸c˜ao: END significa inserir no final (na u ´ltima posi¸ca˜o).

274

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Para consultar a sele¸ca˜o do usu´ario: itens = lb.curselection() que retorna uma lista com os ´ındices dos elementos selecionados (o usu´ario pode efetuar sele¸c˜ao m´ ultipla).

275

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Para apagar os elementos do Listbox use o m´etodo .delete(). Para apagar todos os elementos use: lb.delete(0,END)

276

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

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)

277

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.40

Widget Checkbutton

• Permite selecionar um valor booleano; • Usa uma vari´ avel de controle para armazenar o estado do bot˜ao; var = StringVar() cb = Checkbutton(frame,text="Mai´ usculas",\ variable=var,onvalue="S",offvalue="N",\ command=TrataBot)

278

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 8.2.41

Exemplo: Di´ alogo para Abrir/Salvar Arquivo

Aparˆ encia do di´ alogo:

279

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Uso da classe MyFileDialog: import MyFileDialog d = MyFileDialog.MyFileDialog(root,"Abrir arquivo") filename = d.Get_Output()

280

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

M´ odulos importados pela classe: from Tkinter import * import os, os.path, string

281

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Classe MyFileDialog e seu m´ etodo 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()

282

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Outros m´ etodos da classe MyFileDialog: def null(self): pass def Get_Output(self): return (self.output)

283

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK Classe MyDialog e seu m´ etodo 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("",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)

284

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK self.list = Listbox(self.framelistfile,width=\ fields_size()) self.event_add("","") self.list.bind("",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)

285

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

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

286

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK Outros m´ etodos 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)

287

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 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)

288

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

289

selection = self.list.curselection() if selection != (): s = string.atoi(selection[0]) ld = os.listdir(".") ld.sort() if self.var.get() != "show": ld=Hide(ld) if s!=0: fop = ld[s-1] if os.path.isdir(fop): os.chdir(fop) self.list.delete(0,END) ld = os.listdir(".") ld.sort() if self.var.get() != "show": ld=Hide(ld) ld.insert(0,"..") for input in ld: self.list.insert(END,\ input) self.path["text"] = Get_path()

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

290

else: self.output = fop self.top.destroy() else: os.chdir("..") self.list.delete(0,END) ld = os.listdir(".") ld.sort() if self.var.get() != "show": ld=Hide(ld) ld.insert(0,"..") for input in ld: self.list.insert(END,input) self.path["text"] = Get_path() else: selection = self.ent.get() if selection != "": self.output = selection self.top.destroy() else: pass

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

def Cancel(self): "Handler for Cancel button" self.output = "" self.top.destroy()

291

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Fun¸c˜ oes auxiliares do m´ odulo: 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

292

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.42

Widget Text

Widget mais geral para tratar com textos. Algumas op¸co˜es: background Cor do fundo; borderwidth Espessura da borda; font Fonte usado no texto; foreground Cor do texto; height Altura do widget (em linhas); relief Idˆentico aos widgets anteriores; width Largura do widget (em caracteres de texto);

293

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

wrap Op¸ca˜o que indica como ser´a tratado o texto que exceder o espa¸co dispon´ıvel na linha; xscrollcommand Para usar barra de rolagem horizontal; yscrollcommand Para usar barra de rolagem vertical.

294

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Para manipular o texto s˜ao usados ´ındices. ´Indices: linha.coluna Posi¸ca˜o ap´ os a coluna; linha.end Ao final da linha; INSERT Posi¸c˜ao de inser¸c˜ao; CURRENT Posi¸ca˜o mais pr´oxima ao cursor do mouse; END Ao final do texto; SEL FIRST Imediatamente antes do texto selecionado; SEL LAST Imediatamente ap´os o exto selecionado.

295

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

M´etodos do widget: .delete() Apagar texto; .get() Obter texto; .insert() Inserir texto; .search() Procurar um padr˜ao.

296

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.2.43

Exemplo: Editor ASCII

Aparˆ encia do programa:

297

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

Menus do programa:

298

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK #!/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:

299

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 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")

300

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 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")

301

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 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

302

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 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:

303

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 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()

304

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 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")

305

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 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()

306

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 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")

307

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK 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 filename = "" clipboard = "" and Paste

# global variable # global variable - stores file name (string) # global variable - stores data used by Copy, Cut \

308

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK root = Tk() root.title("Editor V0.1") root.clipboard_clear()

# cleaning Tks clipboard

menu = Menu(root) root.config(menu=menu)

# defining menus

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)

309

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

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) sb.pack(side=RIGHT,fill=Y) frame.pack(fill=BOTH) root.mainloop()

# packing

310

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.3

Extens˜ oes: 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 dever´a tornar-se o padr˜ao; Home page: http://wxpython.org; Python Mega Widgets Conjunto de widgets mais sofisticados; Home page: http://pmw.sourceforge.net;

311

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

8.4

Programa¸c˜ ao Visual com Tk

VTCL Programa¸c˜ao visual em Tcl/Tk; Home page: http://vtcl.sourceforge.net.

312

8

˜ GRAFICA ´ PROGRAMAC ¸ AO USANDO TK

313

View more...

Comments

Copyright © 2017 DATENPDF Inc.