[3] Lundh, Fredrik An Introduction to Tkinter, 1999. http://www.pythonware.com/library/tkinter/ an-introduction-to-tkint...
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