Introducao A Programacao em Python e TK PDF
Introducao A Programacao em Python e TK PDF
Introducao A Programacao em Python e TK PDF
22 de abril de 2005
2
c
Copyright 2005 Carlos A. P. Campani.
E garantida a permissao para copiar, distribuir e/ou
modificar este documento sob os termos da Licenca de
Documentacao Livre GNU (GNU Free Documentation
License), Versao 1.2 ou qualquer versao posterior
publicada pela Free Software Foundation; sem Secoes
Invariantes, Textos de Capa Frontal, e sem Textos de
Quarta Capa. Uma copia da licenca e includa na secao
intitulada GNU Free Documentation License.
veja: http://www.ic.unicamp.br/~norton/fdl.html.
REFERENCIAS 3
Referencias
[1] Catunda, Marco Python: guia de consulta rapida, Ed.
Novatec, 2001.
[2] Python Documentation Index.
http://www.python.org/doc/.
[3] Lundh, Fredrik An Introduction to Tkinter, 1999.
http://www.pythonware.com/library/tkinter/
an-introduction-to-tkinter.pdf
REFERENCIAS 4
Links
(Python Language Website)
http://www.python.org
(Python Resources)
http://www.vex.net/parnassus/
(Tcl/Tk Site)
http://www.tcl.tk
REFERENCIAS 5
Material do Curso
(Laminas do curso)
http://www.ufpel.tche.br/~campani/laminas.pdf
(Laminas para Impressao)
http://www.ufpel.tche.br/~campani/laminas4.ps.gz
(Programas exemplo)
http://www.ufpel.tche.br/~campani/FileDialog.tar.gz
http://www.ufpel.tche.br/~campani/swpackage.tar.gz
REFERENCIAS 6
Programas
Python 2.1;
Tk 8;
Python-tkinter 2.1;
vi;
emacs;
gnuplot e modulo Gnuplot;
REFERENCIAS 7
Numeric 2.0;
MySQL 3;
Python-MySQLdb;
XFreeGL (OpenGL)/ Mesa3D;
PyOpenGL 2.
PIL 1.1.5
REFERENCIAS 8
Obtendo os Programas
Pacotes rpm ou tarball;
Binario (pre-compilado) ou source (tem que compilar);
Paginas oficiais dos programas;
Distribuicoes Linux;
http://rpmfind.net;
http://sourceforge.net.
REFERENCIAS 9
1 Objetivos do Curso
Introduzir a linguagem Python para alunos que ja
saibam programar;
Mostrar, de forma introdutoria, aspectos avancados
de Python, tais como scripts para web, acesso a
MySQL, suporte a audio e OpenGL;
Introduzir o toolkit Tk e mostrar como desenvolver
rapidamente aplicacoes baseadas em janelas
usando-o.
2 CARACTERISTICAS DE PYTHON 11
2 Caractersticas de Python
Criada por Guido van Rossum em 1991;
Evolucao do C
Linguagem de script e linguagem de programacao;
Exemplos de linguagens de script: Tcl, Perl, etc.
Objetivo: substituir C e Java;
Interpretada e interativa;
Multiplataforma: Unices, Windows e Mac (no Linux
e pre-instalado);
Possui suporte a POO;
2 CARACTERISTICAS DE PYTHON 12
Profiling;
Programacao cientfica (NumPy e Gnuplot);
Computacao grafica (PyOpenGL);
Acesso ao servidor MySQL (Python-MySQLdb);
Linguagem de Cola (glue language);
Exemplo: voce pode usar em FORTRAN aquele
pacote grafico que so funciona em C;
Scripts CGI (usando-se modulo CGI);
Finalmente: E software livre!
3 TEORIA VERSUS PRATICA 15
4 Usando o Interpretador
$ python
Python 2.1 (#1, jul 4 2001, 23:56:02)
[GCC 2.95.3 200110315 (release) (conectiva)] on linux-i386
Type "copyright", "credits" or "license" for more information.
>>>
4 USANDO O INTERPRETADOR 17
>>> ^D
$
4 USANDO O INTERPRETADOR 18
>>> 2+2
4
>>> 2+
File "<stdin>", line 1
2+
^
SyntaxError: invalid syntax
>>> # Este e um comentario
... 2*2
4
>>> 7/3
2
>>> 7./3.
2.3333333333333335
Observe o prompt secundario ...
4 USANDO O INTERPRETADOR 19
>>> 1/0
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
>>> print "Esta e uma linha extremamente\
... longa que foi dividida."
Esta e uma linha extremamente longa que foi dividida.
>>>
4 USANDO O INTERPRETADOR 20
Atencao!
Atribuicao: =;
Igualdade: ==.
(inspirado em C)
4 USANDO O INTERPRETADOR 21
>>> a = 10
>>> a
10
>>> a += 1
>>> a
11
>>> b = c = 0
>>> a,b = b,a
>>> a
0
>>> b
11
>>> c
0
4 USANDO O INTERPRETADOR 22
>>> x = 15
>>> x
15
>>> x = 3.1415
>>> x
3.1415000000000002
Lembre-se: Tipagem dinamica!
4 USANDO O INTERPRETADOR 23
>>> z = "x=%d\ny=%4.2f"%(x,y)
>>> print z
x=15
y=1.50
>>> print "x=";print x
x=
15
>>> print "x=",;print x
x= 15
4 USANDO O INTERPRETADOR 25
>>> if x<10:
... print x,
... print "menor"
... else:
... print x,
... print "maior"
...
15 maior
>>>
Observacoes:
Observe o prompt secundario ao final da estrutura;
Nao misturar espacos e tabulacoes em um mesmo
bloco (erro!).
4 USANDO O INTERPRETADOR 27
Tupla:
>>> x=(1,2,3)
>>> x[0]
1
>>> x[1]
2
>>> x[-1]
3
>>> x[-2]
2
>>>
4 USANDO O INTERPRETADOR 28
Lista encadeada:
>>> x = [1,2,3]
>>> x
[1,2,3]
>>> x[0] = 10
>>> x
[10,2,3]
>>> x+[4,5]
[10,2,3,4,5]
>>> x
[10,2,3]
>>> x.append(1000)
[10,2,3,1000]
4 USANDO O INTERPRETADOR 29
>>> x
[10,2,3,1000]
>>>
4 USANDO O INTERPRETADOR 30
String:
>>> x = "Gr^
emio FBPA"
>>> y = " - o maior de todos"
>>> print x+y
Gr^
emio FBPA - o maior de todos
Funcao:
>>> x = float
>>> x
<built-in function float>
>>> x(2)
2.0
4 USANDO O INTERPRETADOR 31
Valor
15
Namespace
Tipo do valor e nao tipo da variavel (nome).
4 USANDO O INTERPRETADOR 33
>>> x = 3
>>> y = 3
>>> print x==y # sim, pois tem o mesmo valor
1
>>> print x is y # sim, pois numeros iguais sempre s~
ao o mesmo objeto
1
>>> x = [1,2]
>>> y = [1,2]
>>> print x==y # sim, pois s~
ao iguais
1
>>> print x is y # n~
ao, pois s~
ao objetos (estruturas) diferentes
0
>>> x = y = [1,2]
>>> print x==y # sim, pois s~
ao iguais
1
>>> print x is y # sim, pois s~
ao o mesmo objeto (mesma estrutura)
1
4 USANDO O INTERPRETADOR 34
>>> x[0] = 10
>>> print x
[10,2]
>>> print y # [10,2] , pois s~
ao o mesmo objeto
[10,2]
>>> x = y = 3
>>> x = 10
>>> print x
10
>>> print y # 3 (n~
ao muda pois e outro objeto - n~
ao estruturado)
3
4 USANDO O INTERPRETADOR 35
$ vi teste.py
<i>
#!/usr/bin/python
print "Ola, mundo!"
<esc>
:wq
$ python teste.py
Ola, mundo!
$ chmod a+x teste.py
$ ./teste.py
Ola, mundo!
$
4 USANDO O INTERPRETADOR 36
5.1 Identificadores
5.2 Numeros
Decimal: 15
Hexadecimal: 0x1f
Octal: 020
Inteiro longo: 15L, 0x1fL, 020L
Ponto flutuante: 327.2, 0., .33333, 2.01e-10
Complexos: 3+2j
5 PROGRAMACAO BASICA PYTHON 42
>>> a = 3+2j
>>> b = complex(1,0)
>>> print a+b
(4+2j)
>>> a.real
3.0
>>> a.imag
2.0
>>>
5 PROGRAMACAO BASICA PYTHON 43
5.3 Strings
Caracteres de escape:
Escape Significado
\" aspas
\n nova linha
\<XXX> ASCII caracter octal
\x<XXX> ASCII caracter hexadecimal
\u<XXXX> Unicode
5 PROGRAMACAO BASICA PYTHON 45
5.4 Operadores
Operadores aritmeticos:
Operador Descricao
+ adicao
- subtracao
* multiplicacao
/ divisao
% resto da divisao
** exponenciacao
x = x+y pode ser substituido por x += y. Isto
funciona para todos os operadores aritmeticos.
5 PROGRAMACAO BASICA PYTHON 48
Operadores logicos:
Operador Descricao
and e logico
or ou logico
not negacao
Sao considerados valores falsos em Python: None, 0,
0.0, () ou [] (sequencia vazia) e {} (dicionario
vazio). Todo o resto e considerado verdadeiro.
5 PROGRAMACAO BASICA PYTHON 49
Comparacoes:
Operador Descricao
> maior
< menor
== igual
>= maior ou igual
<= menor ou igual
<> ou != diferente
is mesmo objeto
in esta contido
5 PROGRAMACAO BASICA PYTHON 50
>>> if a in [a,b,c]:
... print "contido"
...
contido
5 PROGRAMACAO BASICA PYTHON 51
Operadores de bits:
Operador Descricao
| ou
^ ou exclusivo
& e
<< desloca para a esquerda
>> desloca para a direita
~ negacao
5 PROGRAMACAO BASICA PYTHON 52
Exemplos:
>>> 3 | 4
7
>>> 3 & 4
0
>>> 4 << 1
8
>>> 4 << 2
16
>>> ~3
-4
5 PROGRAMACAO BASICA PYTHON 53
Exemplos:
>>> x = (10,30,20)
>>> print len(x)
3
>>> print max(x)
30
>>> print min(x)
10
>>> print x[0:2]
(10,30)
>>> x = [1,2,3]
>>> print x[0:2]
[1,2]
5 PROGRAMACAO BASICA PYTHON 56
Operador Descricao
s[i]=x e s1[i:j]=s2 substituicao
del s[i:j] remove elementos
s.append(x) adiciona elemento
s1.extend(s2) adiciona lista
s.count(x) conta numero de ocorrencias
s.index(x) menor ndice de x
5 PROGRAMACAO BASICA PYTHON 58
Exemplo:
>>> x[Fantomas] = 10-11-1960
>>> x.items()
[(Carlos,15-11-1962),(Fantomas,
10-11-1960)]
>>> x.has_key(Carlos)
1
5 PROGRAMACAO BASICA PYTHON 66
5.7.1 if
if a>b:
print a
else:
print b
Observe endentacao (com brancos ou tabulacoes, mas
sempre coerente).
5 PROGRAMACAO BASICA PYTHON 74
Substitui o case/switch.
if x<0:
print "negativo"
elif x==0:
print "zero"
else:
print "positivo"
Permite quantos elif forem necessarios.
5 PROGRAMACAO BASICA PYTHON 75
5.7.2 while
Exemplo (fatorial):
n,fat = 5,1
while n>1:
fat = n*fat
n -= 1
print fat
Exemplo (Fibonacci):
a,b = 0,1
while b<15:
print b
a,b = b,a+b
5 PROGRAMACAO BASICA PYTHON 76
5.7.3 for
5.7.4 break
5.7.5 continue
Reinicia o laco.
Exemplo:
for i in s[:]:
if len(i) <= 10:
continue
else:
s.remove(i)
5 PROGRAMACAO BASICA PYTHON 84
5.7.6 else
5.7.7 pass
Exemplo:
x = 0
try:
y=1/x
except ZeroDivisionError:
print "erro"
5 PROGRAMACAO BASICA PYTHON 87
5.9 Funcoes
def fat(x):
if x<2:
return 1
else:
return x*fat(x-1)
>>> print fat(5)
120
5 PROGRAMACAO BASICA PYTHON 89
def fat(x):
if x:
return x*fat(x-1)
else:
return 1
Observe a utilidade do valor-verdade falso poder ser 0.
5 PROGRAMACAO BASICA PYTHON 90
Passagem de Parametros:
E o casamento entre parametros reais e parametros
formais;
Tipos de Passagem de Parametros:
Tipo Entrada. Ex: PASCAL (Passagem por Valor
padrao);
Tipo Entrada-Sada. Ex: PASCAL (Passagem por
Referencia VAR);
Tipo Sada (raro). Ex: Passagem por Resultado;
Em Python todos os argumentos sao passados por
referencia a objeto (copia da referencia).
5 PROGRAMACAO BASICA PYTHON 97
Listas+CAR+CDR+Funcoes Anonimas=Programacao
Funcional
5 PROGRAMACAO BASICA PYTHON 100
Exemplo:
>>> f = open("teste.txt","r")
>>> x = f.read()
>>> f.close()
5 PROGRAMACAO BASICA PYTHON 102
$ ./teste.py a b c
[teste.py,a,b,c]
5 PROGRAMACAO BASICA PYTHON 104
5.13 Pydoc
6 Programacao Orientada a
Objetos
Exemplo:
class atomo:
def __init__(self,numat,x,y,z):
self.numat = numat
self.pos = (x,y,z)
def simbolo(self):
return TabSimbAt[self.numat]
def __repr__(self):
return "NumAtom=%d X=%d Y=%d Z=%d"%(self.numat,\
self.pos[0],self.pos[1],self.pos[2])
Observacoes:
self e o proprio objeto;
init e o contrutor da classe;
repr e a rotina de impressao.
6 PROGRAMACAO ORIENTADA A OBJETOS 117
Instanciando:
>>> atomo = atomo(2,0,1,0)
>>> print atomo
NumAtom=2 X=0 Y=1 Z=0
>>> print atomo.simbolo()
He
>>>
6 PROGRAMACAO ORIENTADA A OBJETOS 118
Polimorfismo:
>>> class A:
... def get(self):
... print "Ola, mundo"
...
>>> class B:
... def get(self):
... print "Python"
...
>>> a = A()
>>> b = B()
>>> a.get()
Ola, mundo
>>> b.get()
Python
a e b sao objetos diferentes e a mensagem .get() reage de forma diferente
em cada um.
6 PROGRAMACAO ORIENTADA A OBJETOS 119
>>> e = esconde(10,15)
>>> print e.y
15
>>> e.impx()
10
Metodo privado:
class teste:
def __secreto(self): # metodo privado
...
6 PROGRAMACAO ORIENTADA A OBJETOS 120
Alimento
N
ss NNN
ss NNN
ssss NNN
sy s N&
Leite Sucrilhos
7 PYTHON AVANCADO 125
7 Python Avancado
import Gnuplot,math
x=[]
i=0.0
while i<2*math.pi:
x.append([i,math.sin(i)])
i+=0.005
g=Gnuplot.Gnuplot()
g.title("Seno")
g.xlabel("X")
g.ylabel("SEN(X)")
g.plot(x)
raw_input("pressione enter")
7 PYTHON AVANCADO 127
7 PYTHON AVANCADO 128
import Gnuplot,math
x=[]
y=[]
i=0.0
while i<2*math.pi:
x.append([i,math.sin(i)])
y.append([i,math.cos(i)])
i+=0.005
g=Gnuplot.Gnuplot()
g.title("Seno/Cosseno")
g.xlabel("X")
g.ylabel("SEN(X)/COS(X)")
g.plot(x,y)
raw_input("pressione enter")
7 PYTHON AVANCADO 129
7 PYTHON AVANCADO 130
Determinante:
>>> a = ones((2,2),Float)
>>> a = a*10
>>> print a
[[10.,10.],
[10.,10.]]
>>> print determinant(a)
0.0
7 PYTHON AVANCADO 134
[[ 0.70710678 -0.89442719]
[ 0.70710678 0.4472136 ]]
>>> print q1
[[ 0.47140452 0.94280904]
[-0.74535599 0.74535599]]
>>> print dia
[[ 1. -0. ]
[ 0. -0.5]]
7 PYTHON AVANCADO 136
Multiplicacao de matrizes:
>>> x = matrixmultiply(matrixmultiply(vet,dia),q1)
>>> print x
[[ -6.93618340e-17 1.00000000e-00]
[ 5.00000000e-01 5.00000000e-01]]
7 PYTHON AVANCADO 137
7.3 Internacionalizacao
Modulo gettext;
Acesso a API GNU-gettext;
Permite que as mensagens do aplicativo sejam
escritas em diversas lnguas, de forma que o usuario
possa escolher a lngua que deseja.
7 PYTHON AVANCADO 138
Exemplo:
#include "Python.h"
static PyObject *py_soma(PyObject *self,
PyObject *args) {
double a,b,c;
PyArg_ParseTuple(args,"dd",&a,&b);
c=a+b;
return Py_BuildValue("d",c);
}
static PyMethodDef Somalib_methods[]={
{"soma",py_soma,METH_VARARGS},
{NULL,NULL}
};
7 PYTHON AVANCADO 140
void initSomalib() {
(void) Py_InitModule("Somalib",
Somalib_methods);
}
7 PYTHON AVANCADO 141
Como compilar:
cc -I/usr/include/python2.1 -c Somalib.c
cc -shared Somalib.o -o Somalib.so
7 PYTHON AVANCADO 142
Como usar:
>>> import Somalib
>>> Somalib.soma(10,20)
30
ou
>>> from Somalib import *
>>> soma(10,20)
30
7 PYTHON AVANCADO 144
Outro exemplo:
#include "Python.h"
static PyObject *py_Imprime(PyObject *self,
PyObject *args) {
char *str;
PyArg_ParseTuple(args,"s",&str);
printf("%s\n",str);
Py_INCREF(Py_None);
return Py_None;
}
7 PYTHON AVANCADO 145
void initTrataString() {
(void) Py_InitModule("TrataString",
TrataString_methods);
}
7 PYTHON AVANCADO 147
#include "stdio.h"
main()
{
int x;
scanf("%d",&x);
printf("%d",x*2);
}
>>> import os
>>> f = os.popen("./teste.o","w")
>>> f.write("15")
>>> f.flush()
>>> f.close()
7 PYTHON AVANCADO 151
7.6 Profiling
import random,profile
def escolhe():
global nums
nums = []
for i in range(1,51):
nums.append(int(100*random.random()+1))
def fat(n):
if n<2:
return 1.0
else:
return float(n*fat(n-1))
def main():
global nums
escolhe()
for i in range(0,50):
print nums[i],fat(nums[i])
profile.run(main())
7 PYTHON AVANCADO 153
...
2253 function calls (104 primitive calls) in 0.140 CPU seconds
Famlia OpenGL:
GL Biblioteca basica (comandos primitivos);
GLU Utilitarios e comandos mais complexos (exemplo:
desenhar cilindro);
GLX GL para X-Window;
GLUT Caixa de ferramentas com recursos mais
sofisticados (exemplo: desenhar esfera);
7 PYTHON AVANCADO 156
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH)
glutInitWindowSize(400,400)
glClearColor(0.,0.,0.,1.)
glutCreateWindow("Esferas")
glEnable(GL_LIGHTING)
lightZeroPosition = [-5.,2.,-5.,2.]
lightZeroColor = [.2,.5,.7,.5]
glLightfv(GL_LIGHT0,GL_POSITION,lightZeroPosition)
glLightfv(GL_LIGHT0,GL_DIFFUSE,lightZeroColor)
glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,0.5)
glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,0.03)
glEnable(GL_LIGHT0)
glutDisplayFunc(display)
glutMainLoop()
7 PYTHON AVANCADO 158
def display():
glColor3f(1.,1.,1.)
glTranslatef(0.,.25,-0.25)
glutSolidSphere(.6,100.,5.)
glTranslatef(-0.3,-0.6,.5)
glutSolidSphere(.4,100.,5.)
glutSwapBuffers()
7 PYTHON AVANCADO 159
7 PYTHON AVANCADO 160
#!/usr/bin/python
import cgi
print "Content-Type: text/html"
print
print "<TITLE>CGI teste</TITLE>"
print "<H1>Teste</H1>"
print "Ola, mundo!"
7 PYTHON AVANCADO 170
<HTML>
<HEAD>
<TITLE>Teste</TITLE>
</HEAD>
<BODY>
<H1>Enquete</H1>
<P>
Sua prefer^encia de compra:<P>
<FORM action="http://localhost/cgi-bin/testecgi2.py" method="POST">
<SELECT Name="Prefere">
<OPTION Value="0">Selecione um</OPTION>
<OPTION Value="1">Carro</OPTION>
<OPTION Value="2">Casa</OPTION>
</SELECT>
<P>
Salario:<P>
<INPUT type="text" name="Valor" size="20">
</P>
7 PYTHON AVANCADO 171
Sexo:
<INPUT type="radio" name="Sexo" value="homem" checked>Homem
<INPUT type="radio" name="Sexo" value="mulher">Mulher</P>
<INPUT type="submit" value="Submeter" name="Botao">
</FORM>
</BODY>
</HTML>
7 PYTHON AVANCADO 172
#!/usr/bin/python
import cgi
Curiosidade:
http://www.google.com
GOOGLE=Linux+Python+MySQL
7 PYTHON AVANCADO 174
o=sunau.open("/dev/audio","w")
o.setnchannels(nchannels)
o.setsampwidth(samplewidth)
o.setframerate(framerate)
o.setnframes(nframes)
o.setcomptype(comptype,compname)
o.writeframes(s)
o.close()
7 PYTHON AVANCADO 176
8.1 Introducao ao Tk
Conjunto de widgets projetado por John K.
Ousterhout em 1987;
Home page: http://www.tcl.tk.
Tk = Tool kit (como uma biblioteca);
Widget (coisinha) e um objeto de interface de
usuario grafica;
8 PROGRAMACAO GRAFICA USANDO TK 178
Tk
Tkinter
Python
8 PROGRAMACAO GRAFICA USANDO TK 181
8.2.5 Empacotamento
Frame
Frame
Frame
8 PROGRAMACAO GRAFICA USANDO TK 192
Algumas opcoes:
anchor Posiciona ao empacotar: N, S, W, E, NE, etc.
fill Preenche espaco disponvel: X, Y ou BOTH;
side Posiciona os widgets ao empacotar: LEFT (da
esquerda para a direita na ordem em que forem
empacotados), RIGHT, TOP, BOTTOM.
8 PROGRAMACAO GRAFICA USANDO TK 193
0 1
1
8 PROGRAMACAO GRAFICA USANDO TK 194
Algumas opcoes:
column Indica a coluna da grelha em que sera
posicionado o widget (comeca em 0);
columnspan Caso se queira que o widget ocupe mais
de uma coluna (junta celulas);
row Indica a linha da grelha (comeca em 0);
rowspan Junta linhas;
sticky Determina como o widget vai ocupar uma
celula da grelha: N, S, W, E, N+S (ocupa todo o
espaco horizontal), E+W (ocupa todo o espaco
vertical), N+E+S+W (preenche todo o espaco
disponvel).
8 PROGRAMACAO GRAFICA USANDO TK 195
Principais opcoes:
activebackground Cor de fundo quando o mouse esta
sobre o widget;
activeforeground Cor do texto quando o mouse esta
sobre o widget;
anchor Identico a Label;
bd Espessura da borda;
command Resposta ao clique;
cursor Permite definir o cursor quando o mouse esta
sobre o widget;
8 PROGRAMACAO GRAFICA USANDO TK 206
def callback():
print ("Ola, mundo!")
root = Tk()
root.title("Teste")
frame = Frame(root)
frame.pack()
b = Button(frame,text="Fala vivente",command=callback)
b2 = Button(frame,text="Tchau...",command=root.quit)
b.pack(side=LEFT)
b2.pack(side=LEFT)
root.mainloop()
widget Frame e um container (nao aparece na tela);
command=callback define um callback para o botao;
.pack(side=LEFT) - packing com posicao.
8 PROGRAMACAO GRAFICA USANDO TK 208
8 PROGRAMACAO GRAFICA USANDO TK 209
Algumas opcoes:
background (bg) Cor de fundo do frame;
borderwidth Espessura da borda (default e 0);
height Altura do frame;
relief Identico ao descrito em Label e Button;
width Largura do frame;
8 PROGRAMACAO GRAFICA USANDO TK 210
Modificadores de evento:
Alt O usuario pressionou junto <Alt>;
Control Pressionou junto <Control>;
Double Dois eventos em sequencia (exemplo:
<Double-Button-1>);
8 PROGRAMACAO GRAFICA USANDO TK 214
Nveis de binding:
Binding de instancia - binding de um evento com
um widget especfico;
Exemplo: w.bind("<Button-1>",callback);
Binding de classe - binding de todos os widgets da
classe;
Exemplo:
w.bind_class("Canvas","<Double-Button-2>",\
callback);
Binding da aplicacao - binding de todos os widgets
da aplicacao;
Exemplo:
w.bind_all("<Button-2>",callback);
8 PROGRAMACAO GRAFICA USANDO TK 215
Eventos virtuais:
w.event_add("<<Seleciona>>","Button-1",\
"Button-2")
w.bind("<<Seleciona>>",callback)
8 PROGRAMACAO GRAFICA USANDO TK 217
# usando orientac~
ao a objetos
from Tkinter import *
class Aplic:
def __init__(self,mestre):
frame = Frame(mestre)
frame.pack()
self.bot = Button(frame,text="SAI",fg="red",\
command=frame.quit)
self.bot.pack(side=LEFT)
self.ola = Button(frame,text="Ola",command=self.Ola)
self.ola.pack(side=LEFT)
def Ola(self):
print "Ola, mundo!"
root = Tk()
root.title("Teste")
ap = Aplic(root)
root.mainloop()
8 PROGRAMACAO GRAFICA USANDO TK 218
8 PROGRAMACAO GRAFICA USANDO TK 219
# usando heranca
from Tkinter import *
class Aplic(Frame):
def __init__(self,mestre):
Frame.__init__(self,mestre)
self.bot = Button(mestre,text="SAI",fg="red",\
command=mestre.quit)
self.bot.pack(side=LEFT)
self.ola = Button(mestre,text="Ola",command=self.Ola)
self.ola.pack(side=LEFT)
def Ola(self):
print "Ola, mundo!"
root = Tk()
root.title("Teste")
ap = Aplic(root)
root.mainloop()
8 PROGRAMACAO GRAFICA USANDO TK 220
Observacoes:
No comando class Aplic(Frame), Frame indica a classe-pai;
O comando Frame.__init__(self,mestre), e a chamada do construtor de
Frame.
8 PROGRAMACAO GRAFICA USANDO TK 221
Criando os widgets:
e=""
root = Tk()
root.title("Calc")
frame = Frame(root)
frame2 = Frame(root)
frame.pack(side=TOP)
frame2.pack(side=TOP)
lb = Label(frame,text="",width=20,relief=RIDGE,justify=RIGHT)
lb.pack(fill=X)
b0 = Button(frame2,text="0",bd=3,padx=1,pady=1)
b1 = Button(frame2,text="1",bd=3,padx=1,pady=1)
...
b9 = Button(frame2,text="9",bd=3,padx=1,pady=1)
bmais = Button(frame2,text="+",bd=3,padx=1,pady=1)
bmenos = Button(frame2,text="-",bd=3,padx=1,pady=1)
...
bfecha = Button(frame2,text=")",bd=3,padx=1,pady=1)
8 PROGRAMACAO GRAFICA USANDO TK 222
Layout do teclado:
7 8 9 *
4 5 6 +
1 2 3 -
0 /
( ) =
8 PROGRAMACAO GRAFICA USANDO TK 223
Packing:
b7.grid(row=0,column=0)
b8.grid(row=0,column=1)
b9.grid(row=0,column=2)
bvezes.grid(row=0,column=3)
b4.grid(row=1,column=0)
b5.grid(row=1,column=1)
b6.grid(row=1,column=2)
bmais.grid(row=1,column=3)
b1.grid(row=2,column=0)
b2.grid(row=2,column=1)
b3.grid(row=2,column=2)
bmenos.grid(row=2,column=3)
b0.grid(row=3,column=0)
bdiv.grid(row=3,column=3)
bigual.grid(row=4,column=3)
babre.grid(row=4,column=0)
bfecha.grid(row=4,column=1)
8 PROGRAMACAO GRAFICA USANDO TK 224
Binding:
b0.bind("<Button-1>",digito)
b1.bind("<Button-1>",digito)
...
b9.bind("<Button-1>",digito)
bmais.bind("<Button-1>",opera)
bmenos.bind("<Button-1>",opera)
bvezes.bind("<Button-1>",opera)
bdiv.bind("<Button-1>",opera)
babre.bind("<Button-1>",parenteses)
bfecha.bind("<Button-1>",parenteses)
bigual.bind("<Button-1>",finaliza)
Mainloop:
root.mainloop()
8 PROGRAMACAO GRAFICA USANDO TK 225
Callbacks:
def digito(ev):
global e,lb,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9
if ev.widget==b0:
e+="0"
lb.config(text=e)
elif ev.widget==b1:
e+="1"
lb.config(text=e)
...
elif ev.widget==b8:
e+="8"
lb.config(text=e)
else:
e+="9"
lb.config(text=e)
8 PROGRAMACAO GRAFICA USANDO TK 226
def opera(ev):
global e,lb
if ev.widget==bmais:
e+="+"
lb.config(text=e)
elif ev.widget==bvezes:
e+="*"
lb.config(text=e)
elif ev.widget==bmenos:
e+="-"
lb.config(text=e)
else:
e+="/"
lb.config(text=e)
8 PROGRAMACAO GRAFICA USANDO TK 227
def parenteses(ev):
global e,lb
if ev.widget==babre:
e+="("
lb.config(text=e)
else:
e+=")"
lb.config(text=e)
def finaliza(ev):
global e,lb
try:
r = eval(e)
e=""
lb.config(text=str(r))
except:
e=""
lb.config(text="erro!")
8 PROGRAMACAO GRAFICA USANDO TK 228
8 PROGRAMACAO GRAFICA USANDO TK 229
def callback(evento):
global ano,mes,ent,lb
data = ent.get()
if "/" in data:
try:
ind = data.index("/")
mes = string.atoi(data[0:ind])
ano = string.atoi(data[ind+1:len(data)])
s = calendar.month(ano,mes)
lb.config(text=s)
ent.delete(0,END)
except:
ent.delete(0,END)
else:
try:
mes = string.atoi(data)
s = calendar.month(ano,mes)
lb.config(text=s)
ent.delete(0,END)
except:
ent.delete(0,END)
8 PROGRAMACAO GRAFICA USANDO TK 231
8 PROGRAMACAO GRAFICA USANDO TK 232
Algumas opcoes:
background (bg) Cor do fundo;
borderwidth Espessura da borda;
font O fonte que sera usado dentro do widget;
foreground Cor usada no texto;
justify Controla a forma com que o texto sera alinhado:
LEFT (default), CENTER ou RIGHT;
relief A aparencia do widget;
width Largura do widget (em caracteres de texto).
8 PROGRAMACAO GRAFICA USANDO TK 233
Metodos do widget:
.delete(primeiro, ultimo) Apaga a entrada (exemplo:
e.delete(0,END) apaga toda a entrada);
.get() Obtem a entrada (faz a leitura do widget);
.insert(ndice,string) Insere no widget.
8 PROGRAMACAO GRAFICA USANDO TK 234
Callbacks:
def desenha():
global canvas
canvas.create_line(50,0,50,150,width=3)
canvas.create_line(100,0,100,150,width=3)
canvas.create_line(0,50,150,50,width=3)
canvas.create_line(0,100,150,100,width=3)
8 PROGRAMACAO GRAFICA USANDO TK 236
def desenhacirculo(x,y):
global canvas
canvas.create_oval(x*50+10,y*50+10,x*50+40,y*50+40,width=3)
def desenhacruz(x,y):
global canvas
canvas.create_line(x*50+10,y*50+10,x*50+40,y*50+40,width=3)
canvas.create_line(x*50+10,y*50+40,x*50+40,y*50+10,width=3)
8 PROGRAMACAO GRAFICA USANDO TK 237
def marcaA(x,y):
global tab
tab[y*3+x]=1
def marcaB(x,y):
global tab
tab[y*3+x]=2
8 PROGRAMACAO GRAFICA USANDO TK 238
def posicaoy(y):
if y<50:
return 0
elif y<100:
return 1
else:
return 2
def posicao(x,y):
posy=posicaoy(y)
if x<50:
return (0,posy)
elif x<100:
return(1,posy)
else:
return(2,posy)
8 PROGRAMACAO GRAFICA USANDO TK 239
def ganhou(jog):
global tab
pv=[jog,jog,jog]
if tab[0:3]==pv:
return 1
if tab[3:6]==pv:
return 1
if tab[6:9]==pv:
return 1
if tab[0]==tab[3]==tab[6]==jog:
return 1
if tab[1]==tab[4]==tab[7]==jog:
return 1
if tab[2]==tab[5]==tab[8]==jog:
return 1
if tab[0]==tab[4]==tab[8]==jog:
return 1
if tab[2]==tab[4]==tab[6]==jog:
return 1
return 0
8 PROGRAMACAO GRAFICA USANDO TK 240
def resultado():
global tab
if ganhou(1):
return 1
elif ganhou(2):
return 2
else:
if 0 in tab:
return 0
else:
return 3
8 PROGRAMACAO GRAFICA USANDO TK 241
def clique(event):
global canvas,root,lb,final,jogaA,tab
if final:
canvas.delete(ALL)
desenha()
tab=[0,0,0,0,0,0,0,0,0]
final=0
jogaA=1
lb.config(text="Jogador A")
canvas.config(cursor="circle")
else:
x=canvas.canvasx(event.x)
y=canvas.canvasy(event.y)
x,y=posicao(x,y)
if tab[y*3+x]==0:
if jogaA:
desenhacirculo(x,y)
marcaA(x,y)
else:
desenhacruz(x,y)
marcaB(x,y)
8 PROGRAMACAO GRAFICA USANDO TK 242
jogaA=not jogaA
if jogaA:
lb.config(text="Jogador A")
canvas.config(cursor="circle")
else:
lb.config(text="Jogador B")
canvas.config(cursor="cross")
r=resultado()
if r==1:
lb.config(text="Venceu Jogador A")
final=1
canvas.config(cursor="star")
elif r==2:
lb.config(text="Venceu Jogador B")
final=1
canvas.config(cursor="star")
else:
if r==3:
lb.config(text="Ninguem venceu")
final=1
canvas.config(cursor="star")
8 PROGRAMACAO GRAFICA USANDO TK 243
8 PROGRAMACAO GRAFICA USANDO TK 244
root = Tk()
root.title("Jangada no mar 2")
canvas = Canvas(root,width=300,height=100)
canvas.pack()
canvas.create_rectangle(0,0,300,100,fill="lightblue")
canvas.create_oval(50,35,75,60,fill="yellow",outline="yellow",tags=\
"sol")
canvas.create_rectangle(0,50,300,100,fill="blue",outline="blue")
canvas.create_polygon(150,30,153,27,156,27,159,25,165,30,160,33,155,\
31,152,34,fill="white",tags="nuvem")
canvas.create_polygon(172,20,175,17,178,17,182,15,188,20,183,23,178,\
21,181,22,183,27,175,30,168,28,176,22,fill="white",tags="nuvem2")
canvas.create_polygon(125,65,127,60,129,55,131,45,133,35,133,65,fill=\
"black",tags="jangada")
canvas.create_line(133,35,133,70,fill="black",tags="jangada")
canvas.create_line(120,70,150,70,fill="black",width=3,tags="jangada")
8 PROGRAMACAO GRAFICA USANDO TK 253
Observacoes:
Atribuicao de tags aos objetos;
Um tag pode nomear mais de um objeto e um objeto pode ter mais de um
tag.
8 PROGRAMACAO GRAFICA USANDO TK 254
Binding:
canvas.tag_bind("sol","<Button-1>",apaga_sol)
canvas.tag_bind("nuvem","<Button-1>",apaga_nuvem)
canvas.tag_bind("nuvem2","<Button-1>",apaga_nuvem2)
canvas.tag_bind("jangada","<Button-1>",apaga_jangada)
Mainloop:
root.mainloop()
8 PROGRAMACAO GRAFICA USANDO TK 255
Callbacks:
def apaga_sol(evento):
global canvas
canvas.delete("sol")
def apaga_nuvem(evento):
global canvas
canvas.delete("nuvem")
def apaga_nuvem2(evento):
global canvas
canvas.delete("nuvem2")
def apaga_jangada(evento):
global canvas
canvas.delete("jangada")
8 PROGRAMACAO GRAFICA USANDO TK 256
Bindings:
canvas.tag_bind("sol","<B1-Motion>",pressionou)
canvas.tag_bind("sol","<ButtonRelease-1>",soltou)
8 PROGRAMACAO GRAFICA USANDO TK 257
Callbacks:
def pressionou(evento):
global xm,ym,inicio_arrasto,xs,ys,sombra
xm,ym=evento.x,evento.y
if inicio_arrasto:
inicio_arrasto=0
sombra = canvas.create_oval(xm-12,ym-12,xm+12,ym+12,\
tags="sombra")
xs,ys=xm,ym
else:
canvas.move("sombra",xm-xs,ym-ys)
xs,ys=xm,ym
def soltou(evento):
global canvas,inicio_arrasto
inicio_arrasto=1
canvas.delete("sombra")
canvas.dtag(sombra,"sombra")
x,y,x2,y2=canvas.bbox("sol")
canvas.move("sol",xm-(x+x2)/2,ym-(y+y2)/2)
8 PROGRAMACAO GRAFICA USANDO TK 258
diremov = -1
conta = 0
root = Tk()
...
root.after(100,callback)
root.mainloop()
8 PROGRAMACAO GRAFICA USANDO TK 259
Callback:
def callback():
global root,canvas,diremov,conta
canvas.move("sol",0,diremov)
conta += 1
if conta > 50:
conta = 0
diremov=-1*diremov
root.after(100,callback)
8 PROGRAMACAO GRAFICA USANDO TK 260
Alguns metodos:
get(x,y) Obtem um pixel;
put(dados) Escreve dados na imagem;
write(filename,opcoes) Salva imagem em arquivo;
zoom(escala) Efetua zoom.
8 PROGRAMACAO GRAFICA USANDO TK 263
Algumas opcoes:
background (bg) Cor de fundo;
borderwidth (bd) Espessura da borda do menu;
font Fonte usada no menu.
8 PROGRAMACAO GRAFICA USANDO TK 267
Metodos do widget:
.add cascade() Adiciona um novo elemento em cascata
ao menu;
.add command() Adiciona um comando ao menu;
.delete() Apaga um elemento do menu.
8 PROGRAMACAO GRAFICA USANDO TK 268
8.2.36 Protocolos
Selecao 1
Selecao 2
Selecao 3
..
.
Selecao n
8 PROGRAMACAO GRAFICA USANDO TK 274
lb = Listbox(root)
Metodo .insert() insere no widget.
for i in [1,2,3]:
lb.insert(END,i)
Observacao: END significa inserir no final (na ultima
posicao).
8 PROGRAMACAO GRAFICA USANDO TK 275
Aparencia do dialogo:
8 PROGRAMACAO GRAFICA USANDO TK 280
d = MyFileDialog.MyFileDialog(root,"Abrir arquivo")
filename = d.Get_Output()
8 PROGRAMACAO GRAFICA USANDO TK 281
self.list = Listbox(self.framelistfile,width=\
fields_size())
self.event_add("<<select>>","<Double-Button-1>")
self.list.bind("<<select>>",self.Doubleclick)
self.list["yscrollcommand"]=self.sb.set
self.sb["command"] = self.list.yview
self.list["xscrollcommand"] = self.sb2.set
self.sb2["command"] = self.list.xview
self.var = StringVar()
self.cb = Checkbutton(self.framebuttons,text="Show \
hidden files",variable=self.var,onvalue="show",offvalue="hidden",\
command=self.Showhide)
self.ok = Button(self.framebuttons,text="Ok",\
command=self.Ok)
self.cancel = Button(self.framebuttons,text=\
"Cancel",command=self.Cancel)
self.framefilename.pack(anchor=N)
self.framelistfile.pack(side=TOP)
self.framebuttons.pack(side=BOTTOM)
self.lbl.grid(row=0,column=0)
self.ent.grid(row=0,column=1)
8 PROGRAMACAO GRAFICA USANDO TK 286
self.lblpath.grid(row=1,column=0)
self.path.grid(row=1,column=1)
self.list.grid(row=1,column=0)
self.sb.grid(row=1,column=1,sticky=N+S)
self.sb2.grid(row=2,sticky=W+E)
self.cb.pack(anchor=N)
self.ok.pack(side=LEFT)
self.cancel.pack(side=RIGHT)
ld = os.listdir(".")
ld.sort()
ld.insert(0,"..")
for input in ld:
self.list.insert(END,input)
self.cb.toggle()
8 PROGRAMACAO GRAFICA USANDO TK 287
def Enter(self,event):
"Handler for the filenames entry field"
selection = self.ent.get()
if os.path.isdir(selection): # is dir
os.chdir(selection)
self.list.delete(0,END)
ld = os.listdir(".")
ld.sort()
ld.insert(0,"..")
for input in ld:
self.list.insert(END,input)
self.path["text"] = Get_path()
else:
self.output = selection
self.top.destroy()
def Doubleclick(self,event):
"Handler for Double clicking in the listbox"
self.Ok()
def Ok(self):
"Handler for the Ok button"
self.ent.delete(0,END)
8 PROGRAMACAO GRAFICA USANDO TK 289
selection = self.list.curselection()
if selection != ():
s = string.atoi(selection[0])
ld = os.listdir(".")
ld.sort()
if self.var.get() != "show":
ld=Hide(ld)
if s!=0:
fop = ld[s-1]
if os.path.isdir(fop):
os.chdir(fop)
self.list.delete(0,END)
ld = os.listdir(".")
ld.sort()
if self.var.get() != "show":
ld=Hide(ld)
ld.insert(0,"..")
for input in ld:
self.list.insert(END,\
input)
self.path["text"] = Get_path()
8 PROGRAMACAO GRAFICA USANDO TK 290
else:
self.output = fop
self.top.destroy()
else:
os.chdir("..")
self.list.delete(0,END)
ld = os.listdir(".")
ld.sort()
if self.var.get() != "show":
ld=Hide(ld)
ld.insert(0,"..")
for input in ld:
self.list.insert(END,input)
self.path["text"] = Get_path()
else:
selection = self.ent.get()
if selection != "":
self.output = selection
self.top.destroy()
else:
pass
8 PROGRAMACAO GRAFICA USANDO TK 291
def Cancel(self):
"Handler for Cancel button"
self.output = ""
self.top.destroy()
8 PROGRAMACAO GRAFICA USANDO TK 292
Metodos do widget:
.delete() Apagar texto;
.get() Obter texto;
.insert() Inserir texto;
.search() Procurar um padrao.
8 PROGRAMACAO GRAFICA USANDO TK 297
Aparencia do programa:
8 PROGRAMACAO GRAFICA USANDO TK 298
Menus do programa:
8 PROGRAMACAO GRAFICA USANDO TK 299
#!/usr/bin/python
from Tkinter import *
import MyFileDialog
import os.path
# ASCII editor
# Version: 0.5
# Author: Carlos Campani
# [email protected]
# Use under GNU/GPL
def OpenFile():
global root,text,is_saved,filename
d = MyFileDialog.MyFileDialog(root,"Open File")
filename = d.Get_Output()
try:
8 PROGRAMACAO GRAFICA USANDO TK 300
if filename != "":
f = open(filename,"r")
s=f.read()
text.delete(1.0,END)
text.insert(END,s)
f.close()
root.title("Editor V0.1 - "+filename)
is_saved = 1
except IOError:
Msg("Error","File %s not found"%(filename))
def Save():
global root,text,is_saved,filename
if filename == "":
SaveAs()
else:
f = open(filename,"w")
8 PROGRAMACAO GRAFICA USANDO TK 301
s=text.get(1.0,END)
s=s.encode("latin1")
f.write(s)
f.close()
is_saved = 1
def SaveAs():
global root,text,is_saved,filename
d = MyFileDialog.MyFileDialog(root,"Save As")
filename = d.Get_Output()
if filename != "":
if os.path.isfile(filename):
if Question("Question","File %s already \
exists. Continue?"%(filename)):
f = open(filename,"w")
8 PROGRAMACAO GRAFICA USANDO TK 302
s=text.get(1.0,END)
s=s.encode("latin1")
f.write(s)
f.close()
root.title("Editor V0.1 - "+filename)
is_saved = 1
else:
f = open(filename,"w")
s=text.get(1.0,END)
s=s.encode("latin1")
f.write(s)
f.close()
root.title("Editor V0.1 - "+filename)
is_saved = 1
def Cut():
global clipboard,text
8 PROGRAMACAO GRAFICA USANDO TK 303
ocorreu = 0
try:
clip = text.get(SEL_FIRST,SEL_LAST)
text.delete(SEL_FIRST,SEL_LAST)
except:
ocorreu = 1
if not ocorreu:
clipboard = clip
root.clipboard_clear()
root.clipboard_append(clip)
def Copy():
global clipboard,text
ocorreu = 0
try:
clip = text.get(SEL_FIRST,SEL_LAST)
except:
8 PROGRAMACAO GRAFICA USANDO TK 304
ocorreu = 1
if not ocorreu:
clipboard = clip
root.clipboard_clear()
root.clipboard_append(clip)
def Paste():
global clipboard,text
text.insert(INSERT,clipboard)
global win
win.destroy()
8 PROGRAMACAO GRAFICA USANDO TK 305
def About():
global root,win
win = Toplevel(bd=2)
fra = Frame(win,bd=2)
win.title(title)
fra.pack()
but = Button(fra,text="Ok",command=Outofhere)
but2 = Button(fra,bitmap="info")
8 PROGRAMACAO GRAFICA USANDO TK 306
msg = Message(fra,text=msg,width=size,justify=CENTER)
but2.pack(anchor=NW)
msg.pack()
but.pack(anchor=SE)
root.protocol("WM_DELETE_WINDOW",null)
win.transient(root)
win.grab_set()
win.wait_window(win)
root.protocol("WM_DELETE_WINDOW",root.quit)
global que,win2
que = 1
win2.destroy()
8 PROGRAMACAO GRAFICA USANDO TK 307
global que,win2
que = 0
win2.destroy()
global root,win2,que
que = 0
win2 = Toplevel(bd=2)
fra = Frame(win2,bd=2)
win2.title(title)
fra.pack()
butok = Button(fra,text="Ok",command=Tok,padx=2)
butcancel = Button(fra,text="Cancel",command=Tcancel,padx=2)
butinfo = Button(fra,bitmap="info")
8 PROGRAMACAO GRAFICA USANDO TK 308
msg = Message(fra,text=msg,width=size,justify=CENTER)
butinfo.pack(anchor=NW)
msg.pack()
butok.pack(anchor=SE)
butcancel.pack(anchor=SE)
root.protocol("WM_DELETE_WINDOW",null)
win2.transient(root)
win2.wait_window(win2)
root.protocol("WM_DELETE_WINDOW",root.quit)
return que
root = Tk()
root.title("Editor V0.1")
filemenu = Menu(menu)
menu.add_cascade(label="File",underline=0,menu=filemenu)
filemenu.add_command(label="Open...",underline=0,command=OpenFile)
filemenu.add_command(label="Save",underline=0,command=Save)
filemenu.add_command(label="Save As...",underline=5,command=SaveAs)
filemenu.add_separator()
filemenu.add_command(label="Exit",underline=0,command=root.quit)
editmenu = Menu(menu)
menu.add_cascade(label="Edit",underline=0,menu=editmenu)
editmenu.add_command(label="Cut",underline=1,command=Cut)
editmenu.add_command(label="Copy",underline=0,command=Copy)
editmenu.add_command(label="Paste",underline=0,command=Paste)
8 PROGRAMACAO GRAFICA USANDO TK 310
helpmenu = Menu(menu)
menu.add_cascade(label="Help",menu=helpmenu)
helpmenu.add_command(label="About...",command=About)
text = Text(frame,bg="white")
sb = Scrollbar(frame)
text["yscrollcommand"] = sb.set
sb["command"] = text.yview
text.pack(side=LEFT,fill=BOTH) # packing
sb.pack(side=RIGHT,fill=Y)
frame.pack(fill=BOTH)
root.mainloop()
8 PROGRAMACAO GRAFICA USANDO TK 311