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

  • 5,432 views
Uploaded on

Lâminas para um curso de Python e Tk

Lâminas para um curso de Python e Tk

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
5,432
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
279
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 1 Introdu¸˜o ` Programa¸˜o em Python e ca a ca Tk Carlos A. P. Campani 22 de abril de 2005
  • 2. 2 Copyright c 2005 Carlos A. P. Campani. ´ E garantida a permiss˜o para copiar, distribuir e/ou a modificar este documento sob os termos da Licen¸a de c Documenta¸ao Livre GNU (GNU Free Documentation c˜ License), Vers˜o 1.2 ou qualquer vers˜o posterior a a publicada pela Free Software Foundation; sem Se¸oes c˜ Invariantes, Textos de Capa Frontal, e sem Textos de Quarta Capa. Uma c´pia da licen¸a ´ inclu´ na se¸ao o c e ıda c˜ intitulada ”GNU Free Documentation License”. veja: http://www.ic.unicamp.br/~norton/fdl.html.
  • 3. ˆ REFERENCIAS 3 Referˆncias e [1] Catunda, Marco Python: guia de consulta r´pida, Ed. a 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
  • 4. ˆ REFERENCIAS 4 Links (Python Language Website) http://www.python.org (Python Resources) http://www.vex.net/parnassus/ (Tcl/Tk Site) http://www.tcl.tk
  • 5. ˆ REFERENCIAS 5 Material do Curso (Lˆminas do curso) a http://www.ufpel.tche.br/~campani/laminas.pdf (Lˆminas para Impress˜o) a a 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
  • 6. ˆ REFERENCIAS 6 Programas • Python 2.1; • Tk 8; • Python-tkinter 2.1; • vi; • emacs; • gnuplot e m´dulo Gnuplot; o
  • 7. ˆ REFERENCIAS 7 • Numeric 2.0; • MySQL 3; • Python-MySQLdb; • XFreeGL (OpenGL)/ Mesa3D; • PyOpenGL 2. • PIL 1.1.5
  • 8. ˆ REFERENCIAS 8 Obtendo os Programas • Pacotes rpm ou tarball; • Bin´rio (pr´-compilado) ou source (tem que compilar); a e • P´ginas oficiais dos programas; a • Distribui¸˜es Linux; co • http://rpmfind.net; • http://sourceforge.net.
  • 9. ˆ REFERENCIAS 9 Instalando os Programas em Linux Instalando pacotes rpm: $ su <senha de root> % rpm -i <arquivo pacote> % ^D $ Compilando o fonte: $ su <senha de root> % cd <diret´rio do fonte> o % ./configure % ./make % ./make install
  • 10. 1 OBJETIVOS DO CURSO 10 1 Objetivos do Curso • Introduzir a linguagem Python para alunos que j´ a saibam programar; • Mostrar, de forma introdut´ria, aspectos avan¸ados o c 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¸˜es baseadas em janelas co usando-o.
  • 11. 2 CARACTER´ ISTICAS DE PYTHON 11 2 Caracter´ ısticas de Python • Criada por Guido van Rossum em 1991; • Evolu¸ao do C c˜ • Linguagem de script e linguagem de programa¸ao; c˜ – Exemplos de linguagens de script: Tcl, Perl, etc. – Objetivo: substituir C e Java; • Interpretada e interativa; • Multiplataforma: Unices, Windows e Mac (no Linux ´ pr´-instalado); e e • Possui suporte a POO;
  • 12. 2 CARACTER´ ISTICAS DE PYTHON 12 • Estruturas de controle e de dados avan¸adas (mais c poderosas que C e Java); – Lista encadeada e tabela hash como primitivas da linguagem; – Tratamento de erros de execu¸˜o; ca • Dispensa BEGIN e END (obriga a endenta¸ao e a c˜ estrutura¸˜o do programa); ca • Tipagem dinˆmica (n˜o ´ necess´rio declarar a a e a vari´veis); a • Combinados, os ultimos trˆs itens significam que os ´ e programas em Python s˜o muito menores e mais a “limpos” que os equivalentes em C e Java;
  • 13. 2 CARACTER´ ISTICAS DE PYTHON 13 • Mais verifica¸˜es de erros de sintaxe/execu¸ao que C; co c˜ • Modular (organiza o namespace); from Tkinter import * root = Tk() ou import Tkinter root = Tkinter.Tk() • Ideal para prototipa¸ao r´pida de aplica¸oes; c˜ a c˜ • Gr´ficos em janelas usando-se m´dulo Tkinter; a o • Pode ser extendida usando-se C e C++ (escrevendo-se novos m´dulos); o
  • 14. 2 CARACTER´ ISTICAS DE PYTHON 14 • Profiling; • Programa¸˜o cient´ ca ıfica (NumPy e Gnuplot); • Computa¸˜o gr´fica (PyOpenGL); ca a • Acesso ao servidor MySQL (Python-MySQLdb); • Linguagem de Cola (glue language); Exemplo: vocˆ pode usar em FORTRAN aquele e pacote gr´fico que s´ funciona em C; a o • Scripts CGI (usando-se m´dulo CGI); o ´ • Finalmente: E software livre!
  • 15. 3 ´ TEORIA VERSUS PRATICA 15 3 Teoria Versus Pr´tica a • “Aprender a sintaxe de uma linguagem n˜o ´ tudo”; a e • Metodologia de desenvolvimento de software; – M´todos sistem´ticos; e a – Redu¸ao de problemas; c˜ – Herdar resultados; – Semˆntica formal; a • Teoria e pr´tica andam juntas. a
  • 16. 4 USANDO O INTERPRETADOR 16 4 Usando o Interpretador 4.1 Usando o Interpretador - Modo Interativo $ python Python 2.1 (#1, jul 4 2001, 23:56:02) [GCC 2.95.3 200110315 (release) (conectiva)] on linux-i386 Type "copyright", "credits" or "license" for more information. >>>
  • 17. 4 USANDO O INTERPRETADOR 17 Control-D abandona o interpretador. >>> ^D $
  • 18. 4 USANDO O INTERPRETADOR 18 >>> 2+2 4 >>> 2+ File "<stdin>", line 1 2+ ^ SyntaxError: invalid syntax >>> # Este ´ um coment´rio e a ... 2*2 4 >>> 7/3 2 >>> 7./3. 2.3333333333333335 Observe o prompt secund´rio ... a
  • 19. 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 ´ uma linha extremamente e ... longa que foi dividida." Esta ´ uma linha extremamente longa que foi dividida. e >>>
  • 20. 4 USANDO O INTERPRETADOR 20 Aten¸˜o! ca • Atribui¸ao: =; c˜ • Igualdade: ==. (inspirado em C)
  • 21. 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
  • 22. 4 USANDO O INTERPRETADOR 22 >>> x = 15 >>> x 15 >>> x = 3.1415 >>> x 3.1415000000000002 Lembre-se: Tipagem dinˆmica! a
  • 23. 4 USANDO O INTERPRETADOR 23 >>> print "Ol´, mundo!" a Ol´, mundo! a >>> 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=%dny=%4.2f"%(x,y) x=15 y=1.50
  • 24. 4 USANDO O INTERPRETADOR 24 >>> z = "x=%dny=%4.2f"%(x,y) >>> print z x=15 y=1.50 >>> print "x=";print x x= 15 >>> print "x=",;print x x= 15
  • 25. 4 USANDO O INTERPRETADOR 25 >>> if 1: print "verdadeiro" ... verdadeiro >>> if 0: print "verdadeiro" ... >>> Observa¸˜es: co • Valores-verdade: 0 e 1; • ... ´ o prompt secund´rio. e a
  • 26. 4 USANDO O INTERPRETADOR 26 >>> if x<10: ... print x, ... print "menor" ... else: ... print x, ... print "maior" ... 15 maior >>> Observa¸˜es: co • Observe o prompt secund´rio ao final da estrutura; a • N˜o misturar espa¸os e tabula¸oes em um mesmo a c c˜ bloco (erro!).
  • 27. 4 USANDO O INTERPRETADOR 27 Tupla: >>> x=(1,2,3) >>> x[0] 1 >>> x[1] 2 >>> x[-1] 3 >>> x[-2] 2 >>>
  • 28. 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]
  • 29. 4 USANDO O INTERPRETADOR 29 >>> x [10,2,3,1000] >>>
  • 30. 4 USANDO O INTERPRETADOR 30 String: >>> x = "Gr^mio FBPA" e >>> y = " - o maior de todos" >>> print x+y Gr^mio FBPA - o maior de todos e Fun¸˜o: ca >>> x = float >>> x <built-in function float> >>> x(2) 2.0
  • 31. 4 USANDO O INTERPRETADOR 31 Binding: amarra¸ao entre nomes e valores em um c˜ namespace. Sempre que ocorre uma atribui¸˜o, ocorre uma ca amarra¸ao entre vari´vel e valor. c˜ a >>> a = a+1 A ocorrˆncia de a a esquerda da atribui¸ao ´ uma e c˜ e referˆncia ao objeto (L-value). Observe que tudo em e Python s˜o objetos, inclusive n´meros. A ocorrˆncia de a a u e a direita da atribui¸˜o (R-value) deve ser de-referenciada. ca
  • 32. 4 USANDO O INTERPRETADOR 32 Valor 15 X Namespace “Tipo do valor e n˜o tipo da vari´vel (nome)”. a a
  • 33. 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 n´meros iguais sempre s~o o mesmo objeto u a 1 >>> x = [1,2] >>> y = [1,2] >>> print x==y # sim, pois s~o iguais a 1 >>> print x is y # n~o, pois s~o objetos (estruturas) diferentes a a 0 >>> x = y = [1,2] >>> print x==y # sim, pois s~o iguais a 1 >>> print x is y # sim, pois s~o o mesmo objeto (mesma estrutura) a 1
  • 34. 4 USANDO O INTERPRETADOR 34 >>> x[0] = 10 >>> print x [10,2] >>> print y # [10,2] , pois s~o o mesmo objeto a [10,2] >>> x = y = 3 >>> x = 10 >>> print x 10 >>> print y # 3 (n~o muda pois ´ outro objeto - n~o estruturado) a e a 3
  • 35. 4 USANDO O INTERPRETADOR 35 4.2 Usando o Interpretador - Modo Programado 4.2.1 Exemplo: Programa Ol´, mundo a $ vi teste.py <i> #!/usr/bin/python print "Ol´, mundo!" a <esc> :wq $ python teste.py Ol´, mundo! a $ chmod a+x teste.py $ ./teste.py Ol´, mundo! a $
  • 36. 4 USANDO O INTERPRETADOR 36 4.2.2 Editando os Programas ´ vi E encontrado em qualquer sistema Unix; reconhece programas Python e fornece alguma ajuda atrav´s de cores nos comandos; e
  • 37. 4 USANDO O INTERPRETADOR 37
  • 38. 4 USANDO O INTERPRETADOR 38 emacs Editor encontrado em qualquer instala¸˜o Linux; reconhece ca programas Python e permite executar o programa dentro do pr´prio editor. o
  • 39. 4 USANDO O INTERPRETADOR 39
  • 40. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 40 5 Programa¸˜o B´sica Python ca a 5.1 Identificadores Exemplos: x, a10, carlos campani Observa¸˜o: x = X ca
  • 41. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 41 5.2 N´ meros u Decimal: 15 Hexadecimal: 0x1f Octal: 020 Inteiro longo: 15L, 0x1fL, 020L Ponto flutuante: 327.2, 0., .33333, 2.01e-10 Complexos: 3+2j
  • 42. 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 >>>
  • 43. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 43 5.3 Strings >>> print ’ol´’ a ol´a >>> print "’Machado de Assis’ ´ o nome de um grande escritor" e ’Machado de Assis’ ´ o nome de um grande escritor e >>> print ’"´rico Ver´ssimo" ´ o nome de um grande escritor’ E ı e "´rico Ver´ssimo" ´ o nome de um grande escritor E ı e >>> print "Eis uma aspa: "." Eis uma aspa: ". >>> frase = "Esta ´ a primeira linha.nE esta ´ a segunda!" e e >>> print frase Esta ´ a primeira linha. e E esta ´ a segunda! e >>>
  • 44. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 44 Caracteres de escape: Escape Significado " aspas n nova linha <XXX> ASCII caracter octal x<XXX> ASCII caracter hexadecimal u<XXXX> Unicode
  • 45. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 45 Para n˜o considerar os caracteres de escape use “r” antes da string: a >>> print "PrimeironSegundo" Primeiro Segundo >>> print r"PrimeironSegundo" PrimeironSegundo Suporte ao padr˜o Unicode: a >>> print u"Ol´, mundo!" a Ol´, mundo! a
  • 46. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 46 Algumas opera¸oes sobre strings: c˜ >>> print "Ol´, "+"mundo" # concatena¸~o a ca Ol´, mundo a >>> print "Python"*2 # repeti¸~o ca PythonPython >>> print "Python"[0] # indexa¸~o ca P >>> print "Python"[-2] # indexa¸~o para tr´s ca a o >>> print "Python"[1:4] # particionar yth
  • 47. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 47 5.4 Operadores • Operadores aritm´ticos: e Operador Descri¸ao c˜ + adi¸ao c˜ - subtra¸˜o ca * multiplica¸ao c˜ / divis˜o a % resto da divis˜o a ** exponencia¸ao c˜ x = x+y pode ser substituido por x += y. Isto funciona para todos os operadores aritm´ticos. e
  • 48. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 48 • Operadores l´gicos: o Operador Descri¸ao c˜ and e l´gico o or ou l´gico o not nega¸ao c˜ S˜o considerados valores falsos em Python: None, 0, a 0.0, () ou [] (seq¨ˆncia vazia) e {} (dicion´rio ue a vazio). Todo o resto ´ considerado verdadeiro. e
  • 49. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 49 • Compara¸˜es: co Operador Descri¸ao c˜ > maior < menor == igual >= maior ou igual <= menor ou igual <> ou != diferente is mesmo objeto in est´ contido a
  • 50. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 50 >>> if ’a’ in [’a’,’b’,’c’]: ... print "contido" ... contido
  • 51. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 51 • Operadores de bits: Operador Descri¸ao c˜ | ou ^ ou exclusivo & e << desloca para a esquerda >> desloca para a direita ~ nega¸ao c˜
  • 52. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 52 Exemplos: >>> 3 | 4 7 >>> 3 & 4 0 >>> 4 << 1 8 >>> 4 << 2 16 >>> ~3 -4
  • 53. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 53 5.5 Sequˆncias e Dicion´rios e a • Seq¨ˆncias: strings, tuplas e listas; ue Exemplos: – Tupla: (1,2,3); Observa¸˜o: () ´ a tupla vazia e (1,) ´ uma ca e e tupla com um elemento. – Lista: [1,2,3]; Observa¸˜o: [] ´ a lista vazia. ca e
  • 54. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 54 Opera¸˜es com seq¨ˆncias: co ue Operador Descri¸˜o ca x in s pertinˆncia e x not in s n˜o pertinˆncia a e s1 + s2 concatena¸ao c˜ s*n s concatenado n vezes s[i] indexa¸˜o ca s[i:j] particionar len(s) tamanho da seq¨ˆncia ue min(s) e max(s) menor e maior valor
  • 55. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 55 Exemplos: >>> x = (10,30,20) >>> print len(x) 3 >>> print max(x) 30 >>> print min(x) 10 >>> print x[0:2] (10,30) >>> x = [1,2,3] >>> print x[0:2] [1,2]
  • 56. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 56 No particionamento os valores default s˜o o primeiro a elemento e o ultimo respectivamente, de forma que ´ a[:] ´ uma parti¸˜o idˆntica a lista original (foi feita e ca e apenas uma c´pia). o >>> a = b = [1,2,3] >>> c = a[:] >>> a[0] = 15 >>> a [15,2,3] >>> b [15,2,3] >>> c [1,2,3]
  • 57. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 57 Opera¸˜es com listas: co Operador Descri¸˜o ca s[i]=x e s1[i:j]=s2 substitui¸ao c˜ del s[i:j] remove elementos s.append(x) adiciona elemento s1.extend(s2) adiciona lista s.count(x) conta n´mero de ocorrˆncias u e s.index(x) menor ´ ındice de x
  • 58. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 58 Opera¸˜es com listas (continua¸˜o) co ca s.insert(i,x) insere na posi¸˜o i ca 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
  • 59. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 59 Usando listas como pilhas (´ltimo a entrar ´ o u e primeiro a sair): >>> pilha = [1,2,3] >>> pilha.append(4) >>> pilha [1,2,3,4] >>> pilha.pop() 4 >>> pilha.pop() 3 >>> pilha [1,2]
  • 60. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 60 Usando listas como filas (o primeiro a entrar ´ o e 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]
  • 61. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 61 Implementando CAR e CDR: >>> s=[1,2,3] >>> s[0] # CAR 1 >>> s[1:] # CDR [2,3]
  • 62. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 62 • Dicion´rios: S˜o conjuntos de pares chave-valor; a a Exemplos: >>> x={’Carlos’ : ’15-11-1962’, ’Fantomas’ : ’15-11-1960’} >>> x[’Carlos’] ’15-11-1962’
  • 63. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 63 Opera¸˜es com dicion´rios: co a len(d) tamanho do dicion´rio a d[k] valor da chave k d[k]=x atribui¸ao c˜ del d[k] remove par chave-valor d.clear() apaga todos os elementos d.copy() retorna c´pia do dicion´rio o a d.has_key(k) verdadeiro se a chave existe d.items() retorna lista de todos os elementos
  • 64. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 64 Opera¸˜es com dicion´rios (continua¸ao) co a c˜ d.keys() lista de todas as chaves d1.update(d2) atualiza todas as chaves d.values() lista de todos os valores
  • 65. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 65 Exemplo: >>> x[’Fantomas’] = ’10-11-1960’ >>> x.items() [(’Carlos’,’15-11-1962’),(’Fantomas’, ’10-11-1960’)] >>> x.has_key(’Carlos’) 1
  • 66. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 66 5.6 co ´ Algumas Fun¸˜es Uteis abs(n) Valor absoluto; apply(fun¸˜o,args) Chama uma fun¸˜o com seus ca ca argumentos; Exemplo: >>> def soma(x,y): ... return x+y ... >>> apply(soma,[3,4]) 7 complex(r,i) Cria um n´mero complexo; u
  • 67. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 67 eval(e) Avalia uma express˜o; a 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;
  • 68. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 68 list(s) Retorna uma lista contendo os elementos de uma seq¨ˆncia; ue Exemplo: >>> list("abc") [’a’,’b’,’c’] >>> list((1,2,3)) [1,2,3] long(x) Converte para inteiro longo; pow(x,y) Calcula xy ;
  • 69. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 69 range Retorna uma lista contendo uma seq¨ˆncia de ue n´meros; u 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]
  • 70. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 70 raw input(s) Leitura da entrada padr˜o (n˜o formata); a a Exemplo: >>> x = raw_input("x=") x=15 >>> print x 15 >>> y = raw_input() 2003 >>> print y 2003
  • 71. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 71 str(x) Converte para string; tuple(s) Converte uma seq¨ˆncia para uma tupla; ue Exemplo: >>> tuple("abc") (’a’,’b’,’c’)
  • 72. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 72 5.7 Estruturas de Controle 5.7.1 if if x>0: print "maior que zero"
  • 73. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 73 if a>b: print a else: print b Observe endenta¸ao (com brancos ou tabula¸˜es, mas c˜ co sempre coerente).
  • 74. 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 necess´rios. a
  • 75. 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
  • 76. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 76 5.7.3 for >>> for i in [1,2,3,4,5]: ... print i ... 1 2 3 4 5 >>>
  • 77. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 77 >>> for i in range(1,6): ... print i ... 1 2 3 4 5 >>>
  • 78. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 78 >>> for i in [’Ticiano’,’Jo~o Vitor’,’Luana’]: a ... print i ... Ticiano Jo~o Vitor a Luana
  • 79. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 79 Muitas vezes ´ necess´rio modificar a lista que est´ sendo e a a usada no la¸o for, o que ´ perigoso pois pode fazer o la¸o c e c perder-se. Nestes casos usa-se uma c´pia obtida por o 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’]
  • 80. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 80 Exemplo (sele¸ao direta): c˜ for i in range(0,len(v)): ind=v[i:].index(min(v[i:])) v[i],v[ind+i]=v[ind+i],v[i]
  • 81. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 81 Usando lista para construir uma matriz 3 × 3: >>> m = [] >>> for ind in range(0,9): ... m.append(ind*2) ... >>> m [0, 2, 4, 6, 8, 10, 12, 14, 16] >>> i,j = 2,3 >>> m[(i-1)*3+j-1] = 7 # matriz[2,3] = 7 >>> m [0, 2, 4, 6, 8, 7, 12, 14, 16]
  • 82. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 82 5.7.4 break Interrompe o la¸o mais interior. c Exemplo: achou = 0 for i in s: if i == x: achou = 1 break
  • 83. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 83 5.7.5 continue Reinicia o la¸o. c Exemplo: for i in s[:]: if len(i) <= 10: continue else: s.remove(i)
  • 84. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 84 5.7.6 else O else de um la¸o ´ executado quando o la¸o termina c e c normalmente (n˜o pela ocorrˆncia de um break). a e 5.7.7 pass while 1: # espera por Control-C pass
  • 85. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 85 5.8 Tratamento de Excess˜es o try: trata erros de execu¸ao. c˜ try: bloco except: bloco try: bloco except erro: bloco Erros: ZeroDivisionError, NameError, TypeError, etc.
  • 86. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 86 Exemplo: x = 0 try: y=1/x except ZeroDivisionError: print "erro"
  • 87. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 87 Observa¸˜o: except pode receber mais de um erro ca (identificadores de erros separados por v´ ırgulas).
  • 88. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 88 5.9 Fun¸˜es co def fat(x): if x<2: return 1 else: return x*fat(x-1) >>> print fat(5) 120
  • 89. 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.
  • 90. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 90 def count(s): # retorna tamanho da seq¨encia u^ if s: return count(s[1:])+1 else: return 0 Observe a utilidade do valor-verdade falso poder ser [], () ou "": podemos usar esta fun¸ao com lista, tupla ou c˜ string.
  • 91. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 91 Em Python n˜o existem procedimentos, s´ fun¸oes. Se a a o c˜ fun¸ao n˜o retorna nada n˜o ´ necess´rio void. c˜ a a e a def ola(): print "Ol´, mundo" a >>> ola() Ol´, mundo a
  • 92. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 92 Para declarar uma vari´vel como global use a declara¸˜o a ca global. Exemplo: def teste(): global x x = 15
  • 93. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 93 Podemos definir valores default para os argumentos de uma fun¸ao: c˜ >>> 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
  • 94. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 94 Valores default s˜o avaliados dentro do escopo de a defini¸ao e n˜o dinamicamente: c˜ a >>> i = 15 >>> def teste(a=i): ... print a ... >>> i = 10 >>> teste() 15
  • 95. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 95 Podemos definir fun¸˜es com um n´mero arbitr´rio de co u a argumentos (argumentos excedentes ser˜o transformados a em uma tupla): def fprintf(f,formato,*args): f.write(formato % args)
  • 96. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 96 Passagem de Parˆmetros: a ´ • E o casamento entre parˆmetros reais e parˆmetros a a formais; • Tipos de Passagem de Parˆmetros: a – Tipo Entrada. Ex: PASCAL (Passagem por Valor – padr˜o); a – Tipo Entrada-Sa´ ıda. Ex: PASCAL (Passagem por Referˆncia – VAR); e – Tipo Sa´ (raro). Ex: Passagem por Resultado; ıda – Em Python todos os argumentos s˜o passados por a referˆncia a objeto (c´pia da referˆncia). e o e
  • 97. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 97 Para declarar fun¸˜es anˆnimas, Python usa nota¸˜o co o ca lambda: >>> f = lambda x,y : x+y >>> print f(10,15) 25
  • 98. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 98 Para documentar as fun¸˜es use strings de documenta¸˜o. co ca def ola(): " Esta fun¸ao ´ um exemplo " c~ e pass
  • 99. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 99 5.10 Programa¸˜o Funcional ca Listas+CAR+CDR+Fun¸oes Anˆnimas=Programa¸ao c˜ o c˜ Funcional
  • 100. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 100 5.11 Manipula¸˜o de Arquivos ca • Abrir arquivo com f = open(nome,modo) (modo pode ser “r”, “w” ou “r+”; f ´ um descritor); e • Ler arquivo com f.read(); • Escrever no arquivo com f.write(string); • Flush: f.flush(); • Fechar arquivo com f.close().
  • 101. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 101 Exemplo: >>> f = open("teste.txt","r") >>> x = f.read() >>> f.close()
  • 102. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 102 5.12 Alguns M´dulos do Python o • Extendem as capacidades do interpretador; • Organizam o namespace; • Podemos definir novos m´dulos em C ou Python, ou o importar m´dulos feitos por outros. o
  • 103. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 103 sys Acesso `s fun¸˜es do sistema; a co Exemplo: #!/usr/bin/python import sys print sys.argv $ ./teste.py a b c [’teste.py’,’a’,’b’,’c’]
  • 104. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 104 pickle Convers˜o de objetos em stream bytes (permite a 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() >>>
  • 105. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 105 string Tratamento de strings; >>> import string >>> string.atoi("15") 15 >>> string.strip(" Como vai? ") ’Como vai?’ >>>
  • 106. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 106 re Trata express˜es regulares; o math Fun¸˜es matem´ticas; co a >>> import math >>> print math.sin(.5) 0.479425538604 random Gera¸˜o de n´meros aleat´rios; ca u o Exemplo: >>> import random >>> print random.random() 0.466429115742
  • 107. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 107 calendar Calend´rio perp´tuo; a e 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
  • 108. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 108 os Relacionado ao sistema operacional; Exemplo: >>> import os >>> os.system("ls -l") total 3 drwxrwxr-x 2 carlos carlos 4096 Aug 25 20:39 Mail drwxrwxr-x 2 carlos carlos 4096 Feb 17 11:56 docs drwxrwxr-x 2 carlos carlos 4096 Feb 17 21:46 tmp 0 >>>
  • 109. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 109 os.path Trata caminhos de diret´rios; o Exemplo: >>> import os.path >>> print os.path.abspath(".") /home/carlos Tkinter Acesso ao Tk; signal Intercepta¸ao de eventos ass´ c˜ ıncronos; sockets Interface de rede; thread Cria¸˜o de threads; ca
  • 110. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 110 gzip Compress˜o e descompress˜o gzip; a a readline GNU readline; zipfile Manuseio de arquivos zip.
  • 111. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 111 5.13 Pydoc Completa documenta¸ao dos m´dulos do Python ao c˜ o estilo das man pages do Unix. $ pydoc sys
  • 112. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 112 6 Programa¸˜o Orientada a ca Objetos 6.1 Conceitos B´sicos a • A POO surgiu na ´rea de simula¸ao de sistemas e a c˜ interfaces gr´ficas; a • Simula e Smalltalk; • Facilita a programa¸˜o ao fornecer um mecanismo de ca abstra¸˜o de dados que estimula o reuso de c´digo e ca o disciplina os programadores a usar de forma correta o c´digo que ser´ reusado. o a
  • 113. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 113 Objeto Uma unidade contendo dados e m´todos para e manipular estes dados; Classe Um molde para cria¸˜o de objetos; ca Encapsulamento Os dados e m´todos que manipulam e estes dados est˜o definidos dentro de uma unidade de a c´digo que esconde os detalhes de implementa¸ao o c˜ (abstra¸˜o), permitindo que o programador acesse o ca c´digo atrav´s de uma interface p´blica (ao contr´rio o e u a da implementa¸˜o que ´ privada); ca e Heran¸a Permite o reuso de c´digo atrav´s de um c o e mecanismo de classes e subclasses que s˜o herdadas a das primeiras, criando uma hierarquia;
  • 114. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 114 Mensagens As chamadas aos m´todos s˜o entendidas e a como envio de mensagens para os objetos (toda a computa¸˜o de um programa ´ entendida como uma ca e seq¨ˆncia de mensagens enviadas de objeto para ue objeto); Polimorfismo Cada operador, entendido como uma mensagem enviada a seus operandos reage segundo o contexto (o objeto que est´ sendo usado); a Instancia¸˜o Criar um objeto a partir de uma classe. ca
  • 115. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 115 6.2 Programa¸˜o Orientada a Objetos em Python ca • Definindo classes em Python Sem heran¸a: c class nome: bloco Heran¸a simples: c class nome(classe-pai): bloco Heran¸a m´ ltipla (quando existe mais de uma classe-pai): c u class nome(classe-pai-1,classe-pai-2,...): bloco • Definindo m´todos da classe: usa-se def. e • Em Python, podemos documentar as classes usando strings de documenta¸˜o. ca
  • 116. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 116 • Exemplo: class atomo: def __init__(self,numat,x,y,z): self.numat = numat self.pos = (x,y,z) def simbolo(self): return TabSimbAt[self.numat] def __repr__(self): return "NumAtom=%d X=%d Y=%d Z=%d"%(self.numat, self.pos[0],self.pos[1],self.pos[2]) • Observa¸oes: c˜ – self ´ o pr´prio objeto; e o – init ´ o contrutor da classe; e – repr ´ a rotina de impress˜o. e a
  • 117. 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 >>>
  • 118. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 118 • Polimorfismo: >>> class A: ... def get(self): ... print "Ol´, mundo" a ... >>> class B: ... def get(self): ... print "Python" ... >>> a = A() >>> b = B() >>> a.get() Ol´, mundo a >>> b.get() Python a e b s˜o objetos diferentes e a mensagem .get() reage de forma diferente a em cada um.
  • 119. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 119 • Observa¸ao: tudo que tiver c˜ na frente ´ privado; e class esconde: def __init__(self,x,y): self.__x = x # x ´ privado e self.y = y # y ´ p´blico e u def impx(self): print self.__x >>> e = esconde(10,15) >>> print e.y 15 >>> e.impx() 10 • M´todo privado: e class teste: def __secreto(self): # m´todo privado e ...
  • 120. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 120 • Definindo a classe molecula: class molecula: def __init__(self,nome="desconhecida"): self.nome = nome self.listadeatomos = [] def adicatomo(self,atomo): self.listadeatomos.append(atomo) def __repr__(self): s = "" for a in self.listadeatomos: s = s+"%sn"%a return "Nome=%snLista de atomos=n%s"%(self.nome,s) • Instanciando H2 : >>> hidro1 = atomo(1,0,0,0) >>> hidro2 = atomo(1,1,0,0) >>> h2 = molecula("Mol´cula de Hidrog^nio (H2)") e e >>> h2.adicatomo(hidro1) >>> h2.adicatomo(hidro2)
  • 121. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 121 • Herdando uma classe: class substancia(molecula): def __init__(self,nome,propriedades): molecula.__init__(self,nome) self.propriedades = propriedades def adicatomo(self,atomo): molecula.adicatomo(self,atomo) def __repr__(self): return "Molecula %snPropriedades=%s"%(self.nome, self.propriedades) • Observa¸oes: c˜ – class substancia(molecula): indica que substancia est´ sendo herdada a de molecula (molecula ´ a superclasse, substancia ´ a subclasse); e e – molecula. init (self,nome) significa a chamada do m´todo construtor e pai; – J´ a repr foi totalmente reescrito.
  • 122. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 122 • Atributo de classe e de instˆncia: a class teste: x = 10 # atributo global (de classe) def __init__(self,n): self.y = n # atributo de inst^ncia a ...
  • 123. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 123 • Outro exemplo de heran¸a: c class Alimento: def __init__(self,nome,quantidade): self.nome=nome self.quantidade=quantidade def __repr__(self): return "Nome=%snQuantidade=%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))
  • 124. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 124 Alimento N s NNN ssss NNN ysssss NNN N& Leite Sucrilhos
  • 125. 7 PYTHON AVANCADO ¸ 125 7 Python Avan¸ado c 7.1 M´dulo Gnuplot - Programa¸˜o o ca Cient´ ıfica • M´dulo para acessar o programa externo gnuplot; o • Home page: http://gnuplot-py.sourceforge.net.
  • 126. 7 PYTHON AVANCADO ¸ 126 import Gnuplot,math x=[] i=0.0 while i<2*math.pi: x.append([i,math.sin(i)]) i+=0.005 g=Gnuplot.Gnuplot() g.title("Seno") g.xlabel("X") g.ylabel("SEN(X)") g.plot(x) raw_input("pressione enter")
  • 127. 7 PYTHON AVANCADO ¸ 127
  • 128. 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")
  • 129. 7 PYTHON AVANCADO ¸ 129
  • 130. 7 PYTHON AVANCADO ¸ 130 7.2 Numerical Python - Programa¸˜o ca Cient´ ıfica • Inclui muitos recursos do Matlab, mas ao contr´rio a deste ´ software livre; e • Multiplataforma; • Manipula¸˜o de matrizes e ´lgebra linear: ca a determinante, invers˜o de matriz, matriz transposta, a multiplica¸ao de matrizes, solu¸˜o de sistemas c˜ ca lineares, autovalores e autovetores, etc. • Home page: http://sourceforge.net/projects/numpy.
  • 131. 7 PYTHON AVANCADO ¸ 131 Vetores, matrizes, shape e reshape: >>> from Numeric import * >>> from LinearAlgebra import * >>> a = arrayrange(0,2*pi,0.1) >>> print a [0.,0.1,0.2, ... 6.2] >>> sin(a) [0., 0.09983342, ... -0.0830894] >>> a = zero((3,3),Float) >>> print a [[0.,0.,0.], [0.,0.,0.], [0.,0.,0.]]
  • 132. 7 PYTHON AVANCADO ¸ 132 >>> print a.shape (3,3) >>> reshape(a,(9,)) >>> print a [0.,0.,0.,0.,0.,0.,0.,0.,0.]
  • 133. 7 PYTHON AVANCADO ¸ 133 Determinante: >>> a = ones((2,2),Float) >>> a = a*10 >>> print a [[10.,10.], [10.,10.]] >>> print determinant(a) 0.0
  • 134. 7 PYTHON AVANCADO ¸ 134 Autovalores, autovetores e diagonaliza¸ao: c˜ >>> 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
  • 135. 7 PYTHON AVANCADO ¸ 135 [[ 0.70710678 -0.89442719] [ 0.70710678 0.4472136 ]] >>> print q1 [[ 0.47140452 0.94280904] [-0.74535599 0.74535599]] >>> print dia [[ 1. -0. ] [ 0. -0.5]]
  • 136. 7 PYTHON AVANCADO ¸ 136 Multiplica¸ao de matrizes: c˜ >>> x = matrixmultiply(matrixmultiply(vet,dia),q1) >>> print x [[ -6.93618340e-17 1.00000000e-00] [ 5.00000000e-01 5.00000000e-01]]
  • 137. 7 PYTHON AVANCADO ¸ 137 7.3 Internacionaliza¸˜o ca • M´dulo gettext; o • Acesso ` API GNU-gettext; a • Permite que as mensagens do aplicativo sejam escritas em diversas l´ ınguas, de forma que o usu´rio a possa escolher a l´ ıngua que deseja.
  • 138. 7 PYTHON AVANCADO ¸ 138 7.4 Extendendo Python usando C e C++ • Escrevendo m´dulos em C ou C++; o • Partes do programa C: 1. Defini¸ao das fun¸oes C; c˜ c˜ 2. Tabela de m´todos; e 3. Fun¸˜o de inicializa¸˜o. ca ca • Todos os objetos Python tem py_ na frente; • PyArg Parse traduz de Python para C; • Py BuildValue traduz de C para Python.
  • 139. 7 PYTHON AVANCADO ¸ 139 Exemplo: #include "Python.h" static PyObject *py_soma(PyObject *self, PyObject *args) { double a,b,c; PyArg_ParseTuple(args,"dd",&a,&b); c=a+b; return Py_BuildValue("d",c); } static PyMethodDef Somalib_methods[]={ {"soma",py_soma,METH_VARARGS}, {NULL,NULL} };
  • 140. 7 PYTHON AVANCADO ¸ 140 void initSomalib() { (void) Py_InitModule("Somalib", Somalib_methods); }
  • 141. 7 PYTHON AVANCADO ¸ 141 Como compilar: cc -I/usr/include/python2.1 -c Somalib.c cc -shared Somalib.o -o Somalib.so
  • 142. 7 PYTHON AVANCADO ¸ 142 Como Python encontra os m´dulos? o • PYTHONPATH; • Diret´rio corrente; o • /usr/lib/python2.1/site-packages.
  • 143. 7 PYTHON AVANCADO ¸ 143 Como usar: >>> import Somalib >>> Somalib.soma(10,20) 30 ou >>> from Somalib import * >>> soma(10,20) 30
  • 144. 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("%sn",str); Py_INCREF(Py_None); return Py_None; }
  • 145. 7 PYTHON AVANCADO ¸ 145 static PyObject *py_Tamanho(PyObject *self, PyObject *args) { char *str; int t; PyArg_ParseTuple(args,"s",&str); t=0; while (str[t]!=0) t++; return Py_BuildValue("i",t); }
  • 146. 7 PYTHON AVANCADO ¸ 146 static PyMethodDef TrataString_methods[]={ {"Tamanho",py_Tamanho,METH_VARARGS}, {"Imprime",py_Imprime,METH_VARARGS}, {NULL,NULL} }; void initTrataString() { (void) Py_InitModule("TrataString", TrataString_methods); }
  • 147. 7 PYTHON AVANCADO ¸ 147 Para retornar None: Py_INCREF(Py_None) return Py_None
  • 148. 7 PYTHON AVANCADO ¸ 148 7.5 Comunica¸˜o com Programas em ca Outras Linguagens (C, FORTRAN, LISP, PROLOG, etc.) • Todo programa pode comunicar-se com Python pelo dispositivo de entrada/sa´ padr˜o; ıda a • Usa-se popen ou popen2 para abrir um pipe com o programa.
  • 149. 7 PYTHON AVANCADO ¸ 149 #include "stdio.h" main() { int x; scanf("%d",&x); printf("%d",x*2); } $ gcc -o teste.o teste.c
  • 150. 7 PYTHON AVANCADO ¸ 150 >>> import os >>> f = os.popen("./teste.o","w") >>> f.write("15") >>> f.flush() >>> f.close()
  • 151. 7 PYTHON AVANCADO ¸ 151 7.6 Profiling Permite determinar que partes do programa s˜o a “gargalos” de tempo e devem ser convertidas para C, aumentando o desempenho do programa de forma mais eficiente.
  • 152. 7 PYTHON AVANCADO ¸ 152 import random,profile def escolhe(): global nums nums = [] for i in range(1,51): nums.append(int(100*random.random()+1)) def fat(n): if n<2: return 1.0 else: return float(n*fat(n-1)) def main(): global nums escolhe() for i in range(0,50): print nums[i],fat(nums[i]) profile.run(’main()’)
  • 153. 7 PYTHON AVANCADO ¸ 153 ... 2253 function calls (104 primitive calls) in 0.140 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.100 0.100 <string>:1(?) 1 0.040 0.040 0.140 0.140 profile:0(main()) 0 0.000 0.000 profile:0(profiler) 50 0.000 0.000 0.000 0.000 random.py:154(random) 1 0.010 0.010 0.100 0.100 teste.py:12(main) 1 0.000 0.000 0.000 0.000 teste.py:2(escolhe) 2199/50 0.090 0.000 0.090 0.002 teste.py:7(fat)
  • 154. 7 PYTHON AVANCADO ¸ 154 7.7 Python e OpenGL • OpenGL permite criar gr´ficos 3D (adiciona depth `s a a coordenadas de um ponto) e efetuar transforma¸oes c˜ de imagem (rota¸ao, transla¸ao, etc.) - home pages: c˜ c˜ http://www.opengl.org e http://pyopengl.sourceforge.net; • Placas gr´ficas aceleram as transforma¸˜es; a co • Criado pela Silicon Graphics (como padr˜o aberto); a Amado pelos produtores de jogos: Quake, Diablo, etc. • Implementa¸ao livre: Mesa3D ( home page: c˜ http://www.mesa3d.org).
  • 155. 7 PYTHON AVANCADO ¸ 155 Fam´ OpenGL: ılia GL Biblioteca b´sica (comandos primitivos); a GLU Utilit´rios e comandos mais complexos (exemplo: a desenhar cilindro); GLX GL para X-Window; GLUT Caixa de ferramentas com recursos mais sofisticados (exemplo: desenhar esfera);
  • 156. 7 PYTHON AVANCADO ¸ 156 7.7.1 Exemplo: Programa Esferas from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import *
  • 157. 7 PYTHON AVANCADO ¸ 157 glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH) glutInitWindowSize(400,400) glClearColor(0.,0.,0.,1.) glutCreateWindow("Esferas") glEnable(GL_LIGHTING) lightZeroPosition = [-5.,2.,-5.,2.] lightZeroColor = [.2,.5,.7,.5] glLightfv(GL_LIGHT0,GL_POSITION,lightZeroPosition) glLightfv(GL_LIGHT0,GL_DIFFUSE,lightZeroColor) glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,0.5) glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,0.03) glEnable(GL_LIGHT0) glutDisplayFunc(display) glutMainLoop()
  • 158. 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()
  • 159. 7 PYTHON AVANCADO ¸ 159
  • 160. 7 PYTHON AVANCADO ¸ 160 7.8 PIL - Python Imaging Library • Processamento de imagens; • http://www.pythonware.com/products/pil/.
  • 161. 7 PYTHON AVANCADO ¸ 161 >>> import Image >>> imagem = Image.open("darthmaul2.jpg") >>> print imagem.format, imagem.size, imagem.mode JPEG (1024, 768) RGB >>> imagem.save("darth.gif")
  • 162. 7 PYTHON AVANCADO ¸ 162 7.9 Usando MySQL • M´dulo Python-MySQLdb; o • Vocˆ precisa de acesso ao servidor MySQL (senha). e
  • 163. 7 PYTHON AVANCADO ¸ 163 Banco de dados “meu”, tabela “animal”: Nome Data de nascimento Hamster 2003-01-01 Rintintin 1950-11-15 Acar´ a 1994-11-15
  • 164. 7 PYTHON AVANCADO ¸ 164 >>> import MySQLdb >>> con=MySQLdb.Connection(user="root",passwd= <senha>,db="meu") >>> curs=con.cursor() >>> curs.execute("select * from animal") >>> print curs.fetchall() ((’Hamster’, ’2003-01-01’), (’Rintintin’, ’1950-11-15’), (’Acara’, ’1994-11-15’)) >>> curs.execute("select nome from animal where nascimento>19940101") >>> print curs.fetchall() ((’Hamster’,), (’Acara’,)) >>> curs.execute("select nome from animal where nascimento>19940101 and nome<>’Acara’")
  • 165. 7 PYTHON AVANCADO ¸ 165 >>> print curs.fetchall() ((’Hamster’,),) >>> curs.close() >>> con.close()
  • 166. 7 PYTHON AVANCADO ¸ 166 7.10 Python como Linguagem de Cola (Glue Language) • Python consegue comunicar-se com outras linguagens, acessa gnuplot, OpenGL, MySQL etc. • Isto permite imaginar Python como uma “cola” entre estes recursos; • Podemos usar Python para acessar aquele pacote gr´fico maravilhoso, que s´ funciona com C, em um a o programa FORTRAN, ou ent˜o desenhar uma a interface gr´fica usando Tk para um programa a PROLOG (que originalmente n˜o possui suporte a para Tk);
  • 167. 7 PYTHON AVANCADO ¸ 167 • Um m´dulo que permite Python comunicar-se com o outro programa ´ chamado de wrapper ; e • Podemos usar o swig (http://www.swig.org) para fazer wrappers.
  • 168. 7 PYTHON AVANCADO ¸ 168 7.11 Scripts CGI • Primeiro instalar o servidor Apache corretamente; • Colocar os scripts no diret´rio cgi-bin criado na o instala¸˜o do servidor; ca • Dar previl´gio de execu¸ao para o script; e c˜ • Dois tipos de forms: POST e GET.
  • 169. 7 PYTHON AVANCADO ¸ 169 7.11.1 Exemplo: Ol´, mundo a #!/usr/bin/python import cgi print "Content-Type: text/html" print print "<TITLE>CGI teste</TITLE>" print "<H1>Teste</H1>" print "Ol´, mundo!" a
  • 170. 7 PYTHON AVANCADO ¸ 170 7.11.2 Exemplo: Formul´rio a <HTML> <HEAD> <TITLE>Teste</TITLE> </HEAD> <BODY> <H1>Enquete</H1> <P> Sua prefer^ncia de compra:<P> e <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> Sal´rio:<P> a <INPUT type="text" name="Valor" size="20"> </P>
  • 171. 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>
  • 172. 7 PYTHON AVANCADO ¸ 172 #!/usr/bin/python import cgi print "Content-Type: text/html" print print "<TITLE>CGI teste</TITLE>" form=cgi.FieldStorage() Prefere=form.getvalue("Prefere") Valor=form.getvalue("Valor") Sexo=form.getvalue("Sexo") if Prefere=="0": Preferencia="" elif Prefere=="1": Preferencia="Carro" else: Preferencia="Casa" print "Prefer^ncia: %s<p>"%(Preferencia) e print "Valor: %s<p>"%(Valor) print "Sexo: %s<p>"%(Sexo)
  • 173. 7 PYTHON AVANCADO ¸ 173 Curiosidade: http://www.google.com GOOGLE=Linux+Python+MySQL
  • 174. 7 PYTHON AVANCADO ¸ 174 7.12 Suporte a Som M´dulos sunau e wave. o 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()
  • 175. 7 PYTHON AVANCADO ¸ 175 o=sunau.open("/dev/audio","w") o.setnchannels(nchannels) o.setsampwidth(samplewidth) o.setframerate(framerate) o.setnframes(nframes) o.setcomptype(comptype,compname) o.writeframes(s) o.close()
  • 176. 7 PYTHON AVANCADO ¸ 176 7.13 ´ Processamento de Audio - Ecasound Processamento de ´udio em Python/Linux. a http://www.eca.cx/ecasound/
  • 177. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 177 8 Programa¸˜o Gr´fica usando ca a Tk 8.1 Introdu¸˜o ao Tk ca • Conjunto de widgets projetado por John K. Ousterhout em 1987; • Home page: http://www.tcl.tk. • Tk = Tool kit (como uma biblioteca); • Widget (“coisinha”) ´ um objeto de interface de e usu´rio gr´fica; a a
  • 178. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 178 • Originalmente projetado para ser usado com Tcl (Toolkit Control Language); • Tcl ´ muito limitado como linguagem; e • Pode ser usada tamb´m com Perl e Python; e • M´dulo Tkinter: interface Python-Tk - orientado a o objetos;
  • 179. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 179 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.
  • 180. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 180 8.2 Usando o Tkinter • Tkinter ´ um wrapper para acessar Tk a partir de e Python; • Um wrapper ´ como uma camada que faz a e comunica¸ao de duas outras. c˜ Tk Tkinter Python
  • 181. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 181 8.2.1 Alguns Widgets do Tk Label Exibe texto n˜o formatado; a Button Bot˜o (pode-se associar o clique do mouse com a um “callback”); Frame Container retangular usado para colocar uma hierarquia de widgets filhos (n˜o aparece na tela); a Text Texto formatado edit´vel; a Listbox Sele¸˜o de alternativas; ca
  • 182. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 182 Canvas Exibe objetos gr´ficos (´ um container; pode ser a e 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.
  • 183. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 183 8.2.2 Exemplo: Ol´, mundo a from Tkinter import * root = Tk() lb = Label(root,text="Ol´, mundo!") a lb.pack() root.mainloop()
  • 184. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 184 from Tkinter import * root = Tk() lb = Label(root,text="Ol´, mundo!") a lb.pack() root.mainloop() Descri¸˜o: ca root = Tk() root ´ o handler do widget ra´ (representa a aplica¸˜o); Tk() ´ o e ız ca e construtor da aplica¸˜o; ca Label observe que o construtor Label recebe o handler do root (widget mestre); Label ´ o widget escravo; e text="texto" Op¸ao indicando o texto a ser exibido dentro do widget; c˜ lb Armazena o handler do widget; .pack() M´todo para “empacotar” um widget (exibe na tela); e ´ root.mainloop() E o loop do aplicativo (trata todos os eventos).
  • 185. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 185
  • 186. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 186 8.2.3 Exemplo: Ol´, mundo 2 a from Tkinter import * root = Tk() Label(root,text="Ol´, mundo!").pack() a root.mainloop() Observe que n˜o ´ necess´rio armazenar o handler. a e a
  • 187. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 187 8.2.4 Widget Label: Algumas Op¸˜es co O construtor Label, assim como todos os outros m´todos e construtores de widgets, recebe as op¸oes na forma c˜ chave = valor
  • 188. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 188 anchor Indica onde o texto ser´ posicionado dentro do a widget; Default ´ CENTER; Outros valores s˜o N, E, e a 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;
  • 189. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 189 padx Espa¸o extra a direita e a esquerda do widget (em c pixels); pady Espa¸o extra acima e abaixo; c relief Aparˆncia do widget: FLAT (o default), RIDGE, e GROOVE, RAISED, e SUNKEN; text O texto a ser exibido (nova linha com n); width Largura do widget.
  • 190. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 190 8.2.5 Empacotamento “Empacotar” significa colocar um widget em uma aplica¸ao (determinar sua posi¸˜o em rela¸˜o aos outros c˜ ca ca widgets).
  • 191. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 191 1. Usando-se .pack() - Cria o layout empacotando widgets dentro de widgets de forma hier´rquica a (widgets mestre e escravo), tratando-os como blocos retangulares; Frame Frame Frame
  • 192. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 192 Algumas op¸oes: c˜ anchor Posiciona ao empacotar: N, S, W, E, NE, etc. fill Preenche espa¸o dispon´ c ı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.
  • 193. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 193 2. Usando-se .grid() - Permite criar layouts baseado em uma grelha bidimensional (como uma tabela); 0 1 0 1
  • 194. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 194 Algumas op¸oes: c˜ column Indica a coluna da grelha em que ser´ a posicionado o widget (come¸a em 0); c columnspan Caso se queira que o widget ocupe mais de uma coluna (junta c´lulas); e row Indica a linha da grelha (come¸a em 0); c rowspan Junta linhas; sticky Determina como o widget vai ocupar uma c´lula da grelha: N, S, W, E, N+S (ocupa todo o e espa¸o horizontal), E+W (ocupa todo o espa¸o c c vertical), N+E+S+W (preenche todo o espa¸o c dispon´ıvel).
  • 195. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 195 3. Usando-se .place() - Permite posicionar explicitamente o widget;
  • 196. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 196 Cuidado! Os empacotadores podem ser usados juntos em uma aplica¸ao, mas n˜o em um mesmo frame. c˜ a
  • 197. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 197 8.2.6 Binding e Callback (Handler) • “Binding” ´ um mecanismo geral para associar uma e a¸˜o particular do usu´rio (evento) com um ca a comportamento definido espec´ ıfico da aplica¸˜o; ca • “Callback” ´ a chamada do handler; e • “Handler” ´ a fun¸ao/m´todo que responde ao e c˜ e evento.
  • 198. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 198 8.2.7 M´todos Universais e • S˜o aqueles que existem para todos os widgets; a • 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´i o widget; o
  • 199. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 199 .event add() Cria eventos virtuais; .grab set() Captura todos os eventos da aplica¸˜o; ca .mainloop() Espera por eventos; .quit() Abandona o “mainloop”.
  • 200. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 200 8.2.8 Exemplo: Ol´, mundo 3 a from Tkinter import * root = Tk() root.title("Teste") lb = Label(root,text="Ol´, mundo!",width=20) a lb.pack() root.mainloop() Observa¸˜o: width ´ dado em unidades de texto. ca e
  • 201. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 201
  • 202. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 202 8.2.9 Dimens˜es e Sistema de Coordenadas o • Especificar as dimens˜es em: c (cent´ o ımetros), i (polegadas), m (milimetros), p (pontos de impress˜o); a • Se n˜o especifica a dimens˜o, o valor ´ tomado como a a e pixels; • O sistema de coordenadas ´ relativo ao canto e superior esquerdo da janela, “x” refere-se a distˆncias a na horizontal e “y” refere-se a distˆncias na vertical. a
  • 203. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 203 8.2.10 Exemplo: Ol´, mundo 4 a from Tkinter import * root = Tk() root.title("Teste") b = Button(root,bg="blue",fg="yellow",text="Ol´, mundo!", a width=20,command=root.quit) b.config(activebackground="yellow") # poderia ser feito na cria¸~o ca b.config(activeforeground="blue") b.pack() root.mainloop() Observa¸˜es: co • widget “Button” permite criar bot˜es clic´veis no aplicativo; o a • “bg” ´ a cor de fundo e “fg” ´ a cor do texto; e e • “command” define uma resposta ao evento “clicar no bot˜o”; a • “.config” ´ o m´todo para configurar widgets. e e
  • 204. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 204
  • 205. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 205 8.2.11 Widget Button Principais op¸oes: c˜ 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ˆntico a Label; e bd Espessura da borda; command Resposta ao clique; cursor Permite definir o cursor quando o mouse est´ a sobre o widget;
  • 206. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 206 justify Idˆntico ao widget Label; e padx idem; pady idem; relief idem; text Texto que vai aparecer no bot˜o; a underline Indica a posi¸ao do caracter que ser´ c˜ a sublinhado no texto do widget e servir´ de atalho do a bot˜o (come¸a com 0); a c width Largura do bot˜o. a
  • 207. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 207 8.2.12 Exemplo: Ol´, mundo 5 a from Tkinter import * def callback(): print ("Ol´, mundo!") a 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” ´ um “container” (n˜o aparece na tela); e a • “command=callback” define um callback para o bot˜o; a • “.pack(side=LEFT)” - packing com posi¸˜o. ca
  • 208. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 208
  • 209. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 209 8.2.13 Widget Frame Algumas op¸oes: c˜ background (bg) Cor de fundo do frame; borderwidth Espessura da borda (default ´ 0); e height Altura do frame; relief Idˆntico ao descrito em Label e Button; e width Largura do frame;
  • 210. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 210 8.2.14 Exemplo: Ol´, mundo 6 a from Tkinter import * def callback(evento): # note o argumento evento do callback print ("Ol´, mundo! x=%d y=%d"%(evento.x,evento.y)) a root = Tk() root.title("Teste") frame = Frame(root) frame.pack() b = Button(frame,text="Clique duplo aqui") b.bind("<Double-Button-1>",callback) # binding de eventos b2 = Button(frame,text="Tchau...",command=root.quit) b.pack(side=TOP) # observe que side=TOP b2.pack(side=TOP,fill=X) # fill=X para ocupar todo o espa¸o c root.mainloop()
  • 211. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 211
  • 212. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 212 8.2.15 Mais Sobre Binding • Alguns tipos de eventos: Button O usu´rio pressionou um bot˜o com o a a mouse (exemplo: <Button-1> ´ o bot˜o esquerdo e a do mouse); Configure O usu´rio mudou o tamanho do widget a (por exemplo, arrastando a borda da janela); Enter O mouse entrou na ´rea do widget; a Leave O mouse saiu da ´rea do widget; a Motion O usu´rio est´ arrastando o widget; a a
  • 213. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 213 • Modificadores de evento: Alt O usu´rio pressionou junto <Alt>; a Control Pressionou junto <Control>; Double Dois eventos em seq¨ˆncia (exemplo: ue <Double-Button-1>);
  • 214. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 214 • N´ ıveis de binding: – Binding de instˆncia - binding de um evento com a um widget espec´ ıfico; Exemplo: w.bind("<Button-1>",callback); – Binding de classe - binding de todos os widgets da classe; Exemplo: w.bind_class("Canvas","<Double-Button-2>", callback); – Binding da aplica¸˜o - binding de todos os widgets ca da aplica¸ao; c˜ Exemplo: w.bind_all("<Button-2>",callback);
  • 215. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 215 • Algumas informa¸oes que podem ser passadas para o c˜ handler (callback) atrav´s do argumento evento: e .widget qual widget gerou o callback; .x coordenada x do evento em rela¸˜o ao widget; ca .y coordenada y do evento em rela¸ao ao widget; c˜
  • 216. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 216 • Eventos virtuais: w.event_add("<<Seleciona>>","Button-1", "Button-2") w.bind("<<Seleciona>>",callback)
  • 217. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 217 8.2.16 Exemplo: Ol´, mundo 7 a # usando orienta¸~o a objetos ca 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´",command=self.Ola) a self.ola.pack(side=LEFT) def Ola(self): print "Ol´, mundo!" a root = Tk() root.title("Teste") ap = Aplic(root) root.mainloop()
  • 218. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 218
  • 219. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 219 8.2.17 Exemplo: Ol´, mundo 8 a # usando heran¸a c 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´",command=self.Ola) a self.ola.pack(side=LEFT) def Ola(self): print "Ol´, mundo!" a root = Tk() root.title("Teste") ap = Aplic(root) root.mainloop()
  • 220. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 220 Observa¸˜es: co • No comando class Aplic(Frame), Frame indica a classe-pai; • O comando Frame.__init__(self,mestre), ´ a chamada do construtor de e Frame.
  • 221. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 221 8.2.18 Exemplo: Calculadora Criando os widgets: e="" root = Tk() root.title("Calc") frame = Frame(root) frame2 = Frame(root) frame.pack(side=TOP) frame2.pack(side=TOP) lb = Label(frame,text="",width=20,relief=RIDGE,justify=RIGHT) lb.pack(fill=X) b0 = Button(frame2,text="0",bd=3,padx=1,pady=1) b1 = Button(frame2,text="1",bd=3,padx=1,pady=1) ... b9 = Button(frame2,text="9",bd=3,padx=1,pady=1) bmais = Button(frame2,text="+",bd=3,padx=1,pady=1) bmenos = Button(frame2,text="-",bd=3,padx=1,pady=1) ... bfecha = Button(frame2,text=")",bd=3,padx=1,pady=1)
  • 222. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 222 Layout do teclado: 7 8 9 * 4 5 6 + 1 2 3 - 0 / ( ) =
  • 223. 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)
  • 224. 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()
  • 225. 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)
  • 226. 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)
  • 227. 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!")
  • 228. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 228
  • 229. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 229 8.2.19 Exemplo: Calend´rio a from Tkinter import * import time,calendar,tkFont,string root = Tk() root.title("Calend´rio") a frame = Frame(root) frame.pack() ent = Entry(frame) ent.bind("<Return>",callback) font = tkFont.Font(family="Computer",size="16") lb = Label(frame,width=25,height=10,bg="yellow",font=font, justify="left") data = time.localtime() ano = data[0] mes = data[1] s = calendar.month(ano,mes) lb.config(text=s) ent.pack(side=TOP,fill=X) lb.pack(side=TOP) root.mainloop()
  • 230. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 230 def callback(evento): global ano,mes,ent,lb data = ent.get() if "/" in data: try: ind = data.index("/") mes = string.atoi(data[0:ind]) ano = string.atoi(data[ind+1:len(data)]) s = calendar.month(ano,mes) lb.config(text=s) ent.delete(0,END) except: ent.delete(0,END) else: try: mes = string.atoi(data) s = calendar.month(ano,mes) lb.config(text=s) ent.delete(0,END) except: ent.delete(0,END)
  • 231. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 231
  • 232. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 232 8.2.20 Widget Entry Algumas op¸oes: c˜ background (bg) Cor do fundo; borderwidth Espessura da borda; font O fonte que ser´ usado dentro do widget; a foreground Cor usada no texto; justify Controla a forma com que o texto ser´ alinhado: a LEFT (default), CENTER ou RIGHT; relief A aparˆncia do widget; e width Largura do widget (em caracteres de texto).
  • 233. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 233 M´todos do widget: e .delete(primeiro, ultimo) Apaga a entrada (exemplo: ´ e.delete(0,END) apaga toda a entrada); .get() Obt´m a entrada (faz a leitura do widget); e .insert(´ ındice,string) Insere no widget.
  • 234. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 234 8.2.21 Exemplo: Jogo da Velha from Tkinter import * final=0 jogaA=1 root=Tk() frame=Frame(root) frame.pack() root.title("Jogo da Velha") lb=Label(frame,text="Jogador A") lb.pack(side=TOP) canvas=Canvas(frame,bg="blue",height=150,width=150,cursor="circle", relief=GROOVE) canvas.pack(side=BOTTOM) desenha() canvas.bind("<Button-1>",clique) tab=[0,0,0,0,0,0,0,0,0] root.mainloop()
  • 235. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 235 Callbacks: def desenha(): global canvas canvas.create_line(50,0,50,150,width=3) canvas.create_line(100,0,100,150,width=3) canvas.create_line(0,50,150,50,width=3) canvas.create_line(0,100,150,100,width=3)
  • 236. 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)
  • 237. 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
  • 238. 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)
  • 239. 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
  • 240. 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
  • 241. 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)
  • 242. 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")
  • 243. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 243
  • 244. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 244 8.2.22 Widget Canvas Container para objetos gr´ficos (permite definir widgets a personalizados). Principais op¸oes: c˜ borderwidth Espessura da borda; background Cor de fundo; cursor Permite escolher o cursor que ser´ usado quando a o mouse est´ sobre o canvas; a height Altura do canvas (em pixels); width Largura do canvas (em pixels);
  • 245. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 245 xscrollcommand Este atributo deve ser o m´todo .set e da barra de rolagem horizontal (se possuir barra de rolagem); yscrollcommand Este atributo deve ser o m´todo .set e da barra de rolagem vertical.
  • 246. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 246 Principais objetos (m´todos para cria¸˜o): e ca .create arc() Desenha arcos; .create image() Importa uma imagem (geralmente GIF); .create line() Desenha linha; .create oval() Ovais/c´ ırculos, definido por um bbox (4 coordenadas); .create polygon() Pol´ ıgono definido por uma seq¨ˆncia ue de coordenadas de pontos que formam os v´rtices do e pol´ ıgono;
  • 247. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 247 .create rectangle() Retˆngulo, definido por um bbox a (4 coordenadas); .create text() Permite colocar texto.
  • 248. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 248 8.2.23 Exemplo: Gr´ficos em Pizza a from Tkinter import * root = Tk() root.title("Pizza") canvas = Canvas(root,height=200,width=320) canvas.pack() xy = 25,30,295,185 # note a tupla com supress~o dos par^nteses a e canvas.create_arc(xy,start=0,extent=250,fill="red") canvas.create_arc(xy,start=250,extent=70,fill="green") canvas.create_arc(xy,start=320,extent=40,fill="blue") root.mainloop()
  • 249. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 249
  • 250. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 250 8.2.24 Exemplo: Jangada from Tkinter import * root = Tk() root.title("Jangada no mar") canvas = Canvas(root,width=300,height=100) canvas.pack() canvas.create_rectangle(0,0,300,100,fill="lightblue") # c´u e canvas.create_oval(50,35,75,60,fill="yellow",outline="yellow") # sol canvas.create_rectangle(0,50,300,100,fill="blue",outline="blue") # mar canvas.create_polygon(150,30,153,27,156,27,159,25,165,30,160,33,155,31, 152,34,fill="white") # nuvem canvas.create_polygon(172,20,175,17,178,17,182,15,188,20,183,23,178,21, 181,22,183,27,175,30,168,28,176,22,fill="white") # nuvem 2 canvas.create_polygon(125,65,127,60,129,55,131,45,133,35,133,65,fill= "black") # jangada (vela) canvas.create_line(133,35,133,70,fill="black") # jangada (mastro) canvas.create_line(120,70,150,70,fill="black",width=3) # jangada (base) root.mainloop()
  • 251. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 251
  • 252. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 252 8.2.25 Exemplo: Clicando e Apagando root = Tk() root.title("Jangada no mar 2") canvas = Canvas(root,width=300,height=100) canvas.pack() canvas.create_rectangle(0,0,300,100,fill="lightblue") canvas.create_oval(50,35,75,60,fill="yellow",outline="yellow",tags= "sol") canvas.create_rectangle(0,50,300,100,fill="blue",outline="blue") canvas.create_polygon(150,30,153,27,156,27,159,25,165,30,160,33,155, 31,152,34,fill="white",tags="nuvem") canvas.create_polygon(172,20,175,17,178,17,182,15,188,20,183,23,178, 21,181,22,183,27,175,30,168,28,176,22,fill="white",tags="nuvem2") canvas.create_polygon(125,65,127,60,129,55,131,45,133,35,133,65,fill= "black",tags="jangada") canvas.create_line(133,35,133,70,fill="black",tags="jangada") canvas.create_line(120,70,150,70,fill="black",width=3,tags="jangada")
  • 253. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 253 Observa¸˜es: co • Atribui¸˜o de “tags” aos objetos; ca • Um tag pode nomear mais de um objeto e um objeto pode ter mais de um tag.
  • 254. 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()
  • 255. 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")
  • 256. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 256 8.2.26 Exemplo: Arrastando o Sol Bindings: canvas.tag_bind("sol","<B1-Motion>",pressionou) canvas.tag_bind("sol","<ButtonRelease-1>",soltou)
  • 257. 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)
  • 258. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 258 8.2.27 Movimentando o Sol Usaremos after(tempo,callback) para gerar interrup¸oes de 100ms e c˜ canvas.move(tag,dx,dy) para mover o Sol. diremov = -1 conta = 0 root = Tk() ... root.after(100,callback) root.mainloop()
  • 259. 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)
  • 260. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 260 8.2.28 Exemplo: Visualizador de Imagens from Tkinter import * root = Tk() canvas = Canvas(root,width=400,height=300) canvas.pack() foto = PhotoImage(file="jv.gif") img = canvas.create_image(0,0,anchor=NW,image=foto) root.mainloop()
  • 261. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 261
  • 262. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 262 8.2.29 Widget PhotoImage Alguns m´todos: e get(x,y) Obt´m um pixel; e put(dados) Escreve dados na imagem; write(filename,op¸oes) Salva imagem em arquivo; c˜ zoom(escala) Efetua zoom.
  • 263. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 263 8.2.30 Definindo um Widget “Custom” • Exemplo: um novo bot˜o OK; a • Usar Canvas.
  • 264. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 264 8.2.31 Exemplo: Usando Menus e Di´logos a 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()
  • 265. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 265
  • 266. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 266 8.2.32 Widget Menu Algumas op¸oes: c˜ background (bg) Cor de fundo; borderwidth (bd) Espessura da borda do menu; font Fonte usada no menu.
  • 267. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 267 M´todos do widget: e .add cascade() Adiciona um novo elemento em cascata ao menu; .add command() Adiciona um comando ao menu; .delete() Apaga um elemento do menu.
  • 268. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 268 8.2.33 Widget Toplevel ´ E uma janela independente de root (n˜o ´ empacotada). a e Algumas op¸oes: c˜ background Cor de fundo; height Altura da janela (em pixels); width Largura da janela (em pixels). Observa¸˜o: Janelas Toplevel (inclusive root) possuem o ca m´todo .title(). e
  • 269. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 269 8.2.34 Definindo uma Janela Transiente e Usando grab set() • Problema 1: O usu´rio continua com acesso ` janela a a root; • Problema 2: O usu´rio pode minimizar a janela ou o a di´logo de forma independente; a • Solu¸˜o do problema 1: .grab set(); ca • Solu¸˜o do problema 2: Janela transiente. ca
  • 270. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 270 8.2.35 Exemplo: Usando Menus e Di´logos 2 a 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()
  • 271. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 271 8.2.36 Protocolos Quando ´ necess´rio interferir na comunica¸ao entre o e a c˜ aplicativo e o gerenciador de janelas. Exemplo: w.protocol("WM DELETE WINDOW",handler)
  • 272. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 272 8.2.37 Esperando uma Janela • Usa-se o m´todo .wait window(janela) para e aguardar que um determinado widget seja destruido (entra em um la¸o de evento local); c • Serve para aguardar que uma janela desapare¸a da c tela.
  • 273. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 273 8.2.38 Widget Listbox Para apresentar uma lista de alternativas. Sele¸ao 1 c˜ Sele¸ao 2 c˜ Sele¸ao 3 c˜ . . . Sele¸˜o n ca
  • 274. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 274 lb = Listbox(root) M´todo .insert() insere no widget. e for i in [’1’,’2’,’3’]: lb.insert(END,i) Observa¸˜o: END significa inserir no final (na ultima ca ´ posi¸ao). c˜
  • 275. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 275 Para consultar a sele¸ao do usu´rio: c˜ a itens = lb.curselection() que retorna uma lista com os ´ındices dos elementos selecionados (o usu´rio pode efetuar sele¸˜o m´ltipla). a ca u
  • 276. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 276 Para apagar os elementos do Listbox use o m´todo e .delete(). Para apagar todos os elementos use: lb.delete(0,END)
  • 277. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 277 8.2.39 Widget Scrollbar Permite criar uma barra de rolagem. sb = Scrollbar(frame) lb = Listbox(frame) lb["yscrollcommand"] = sb.set sb["command"] = lb.yview lb.pack(side=LEFT) sb.pack(side=LEFT,fill=Y)
  • 278. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 278 8.2.40 Widget Checkbutton • Permite selecionar um valor booleano; • Usa uma vari´vel de controle para armazenar o a estado do bot˜o; a var = StringVar() cb = Checkbutton(frame,text="Mai´sculas", u variable=var,onvalue="S",offvalue="N", command=TrataBot)
  • 279. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 279 8.2.41 Exemplo: Di´logo para Abrir/Salvar Arquivo a Aparˆncia do di´logo: e a
  • 280. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 280 Uso da classe MyFileDialog: import MyFileDialog d = MyFileDialog.MyFileDialog(root,"Abrir arquivo") filename = d.Get_Output()
  • 281. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 281 M´dulos importados pela classe: o from Tkinter import * import os, os.path, string
  • 282. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 282 Classe MyFileDialog e seu m´todo construtor: e 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()
  • 283. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 283 Outros m´todos da classe MyFileDialog: e def null(self): pass def Get_Output(self): return (self.output)
  • 284. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 284 Classe MyDialog e seu m´todo construtor: e class MyDialog(Frame): "MyDialog class - dialog for file save and open" def __init__(self,parent,output): Frame.__init__(self,parent) self.output=output self.top=parent self.framefilename = Frame(self,bd=2) self.framelistfile = Frame(self,bd=2) self.framebuttons = Frame(self,bd=2) self.lbl = Label(self.framefilename,text="File:") self.ent = Entry(self.framefilename,width=fields_size()) self.ent.focus_set() self.ent.bind("<Return>",self.Enter) self.lblpath = Label(self.framefilename,text="Path:") self.path = Label(self.framefilename,text=Get_path(), width=fields_size(),justify=LEFT,relief=GROOVE) self.sb = Scrollbar(self.framelistfile) self.sb2 = Scrollbar(self.framelistfile,orient= HORIZONTAL)
  • 285. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 285 self.list = Listbox(self.framelistfile,width= fields_size()) self.event_add("<<select>>","<Double-Button-1>") self.list.bind("<<select>>",self.Doubleclick) self.list["yscrollcommand"]=self.sb.set self.sb["command"] = self.list.yview self.list["xscrollcommand"] = self.sb2.set self.sb2["command"] = self.list.xview self.var = StringVar() self.cb = Checkbutton(self.framebuttons,text="Show hidden files",variable=self.var,onvalue="show",offvalue="hidden", command=self.Showhide) self.ok = Button(self.framebuttons,text="Ok", command=self.Ok) self.cancel = Button(self.framebuttons,text= "Cancel",command=self.Cancel) self.framefilename.pack(anchor=N) self.framelistfile.pack(side=TOP) self.framebuttons.pack(side=BOTTOM) self.lbl.grid(row=0,column=0) self.ent.grid(row=0,column=1)
  • 286. 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()
  • 287. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 287 Outros m´todos da classe MyDialog: e 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)
  • 288. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 288 def Enter(self,event): "Handler for the filenames entry field" selection = self.ent.get() if os.path.isdir(selection): # is dir os.chdir(selection) self.list.delete(0,END) ld = os.listdir(".") ld.sort() ld.insert(0,"..") for input in ld: self.list.insert(END,input) self.path["text"] = Get_path() else: self.output = selection self.top.destroy() def Doubleclick(self,event): "Handler for Double clicking in the listbox" self.Ok() def Ok(self): "Handler for the Ok button" self.ent.delete(0,END)
  • 289. 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()
  • 290. 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
  • 291. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 291 def Cancel(self): "Handler for Cancel button" self.output = "" self.top.destroy()
  • 292. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 292 Fun¸˜es auxiliares do m´dulo: co o 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
  • 293. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 293 8.2.42 Widget Text Widget mais geral para tratar com textos. Algumas op¸oes: c˜ 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ˆntico aos widgets anteriores; e width Largura do widget (em caracteres de texto);
  • 294. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 294 wrap Op¸ao que indica como ser´ tratado o texto que c˜ a exceder o espa¸o dispon´ na linha; c ıvel xscrollcommand Para usar barra de rolagem horizontal; yscrollcommand Para usar barra de rolagem vertical.
  • 295. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 295 Para manipular o texto s˜o usados ´ a ındices. ´ Indices: linha.coluna Posi¸ao ap´s a coluna; c˜ o linha.end Ao final da linha; INSERT Posi¸˜o de inser¸˜o; ca ca CURRENT Posi¸ao mais pr´xima ao cursor do mouse; c˜ o END Ao final do texto; SEL FIRST Imediatamente antes do texto selecionado; SEL LAST Imediatamente ap´s o exto selecionado. o
  • 296. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 296 M´todos do widget: e .delete() Apagar texto; .get() Obter texto; .insert() Inserir texto; .search() Procurar um padr˜o. a
  • 297. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 297 8.2.43 Exemplo: Editor ASCII Aparˆncia do programa: e
  • 298. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 298 Menus do programa:
  • 299. 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 # campani@ufpel.tche.br # 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:
  • 300. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 300 if filename != "": f = open(filename,"r") s=f.read() text.delete(1.0,END) text.insert(END,s) f.close() root.title("Editor V0.1 - "+filename) is_saved = 1 except IOError: Msg("Error","File ’%s’ not found"%(filename)) def Save(): "Handler for Save event" global root,text,is_saved,filename if filename == "": SaveAs() else: f = open(filename,"w")
  • 301. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 301 s=text.get(1.0,END) s=s.encode("latin1") f.write(s) f.close() is_saved = 1 def SaveAs(): "Handler for SaveAs event" global root,text,is_saved,filename d = MyFileDialog.MyFileDialog(root,"Save As") filename = d.Get_Output() if filename != "": if os.path.isfile(filename): if Question("Question","File ’%s’ already exists. Continue?"%(filename)): f = open(filename,"w")
  • 302. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 302 s=text.get(1.0,END) s=s.encode("latin1") f.write(s) f.close() root.title("Editor V0.1 - "+filename) is_saved = 1 else: f = open(filename,"w") s=text.get(1.0,END) s=s.encode("latin1") f.write(s) f.close() root.title("Editor V0.1 - "+filename) is_saved = 1 def Cut(): "Handler for Cut event" global clipboard,text
  • 303. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 303 ocorreu = 0 try: clip = text.get(SEL_FIRST,SEL_LAST) text.delete(SEL_FIRST,SEL_LAST) except: ocorreu = 1 if not ocorreu: clipboard = clip root.clipboard_clear() root.clipboard_append(clip) def Copy(): "Handler for Copy event" global clipboard,text ocorreu = 0 try: clip = text.get(SEL_FIRST,SEL_LAST) except:
  • 304. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 304 ocorreu = 1 if not ocorreu: clipboard = clip root.clipboard_clear() root.clipboard_append(clip) def Paste(): "Handler for Paste event" global clipboard,text text.insert(INSERT,clipboard) def Outofhere(): # destroy message window (global win) global win win.destroy()
  • 305. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 305 def null(): # do nothing pass def About(): "Handler for About event" Msg("About","Editor V0.1nVersion: 0.5nAuthor: Carlos Campanincampani@ufpel.tche.brnUse 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")
  • 306. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 306 msg = Message(fra,text=msg,width=size,justify=CENTER) but2.pack(anchor=NW) msg.pack() but.pack(anchor=SE) root.protocol("WM_DELETE_WINDOW",null) win.transient(root) win.grab_set() win.wait_window(win) root.protocol("WM_DELETE_WINDOW",root.quit) def Tok(): # handler Ok button for question window global que,win2 que = 1 win2.destroy()
  • 307. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 307 def Tcancel(): # handler Cancel button for question window global que,win2 que = 0 win2.destroy() def Question(title,msg,size=250): # opens a question window global root,win2,que que = 0 win2 = Toplevel(bd=2) fra = Frame(win2,bd=2) win2.title(title) fra.pack() butok = Button(fra,text="Ok",command=Tok,padx=2) butcancel = Button(fra,text="Cancel",command=Tcancel,padx=2) butinfo = Button(fra,bitmap="info")
  • 308. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 308 msg = Message(fra,text=msg,width=size,justify=CENTER) butinfo.pack(anchor=NW) msg.pack() butok.pack(anchor=SE) butcancel.pack(anchor=SE) root.protocol("WM_DELETE_WINDOW",null) win2.transient(root) win2.wait_window(win2) root.protocol("WM_DELETE_WINDOW",root.quit) return que is_saved = 0 # global variable filename = "" # global variable - stores file name (string) clipboard = "" # global variable - stores data used by Copy, Cut and Paste
  • 309. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 309 root = Tk() root.title("Editor V0.1") root.clipboard_clear() # cleaning Tks clipboard menu = Menu(root) # defining menus root.config(menu=menu) filemenu = Menu(menu) menu.add_cascade(label="File",underline=0,menu=filemenu) filemenu.add_command(label="Open...",underline=0,command=OpenFile) filemenu.add_command(label="Save",underline=0,command=Save) filemenu.add_command(label="Save As...",underline=5,command=SaveAs) filemenu.add_separator() filemenu.add_command(label="Exit",underline=0,command=root.quit) editmenu = Menu(menu) menu.add_cascade(label="Edit",underline=0,menu=editmenu) editmenu.add_command(label="Cut",underline=1,command=Cut) editmenu.add_command(label="Copy",underline=0,command=Copy) editmenu.add_command(label="Paste",underline=0,command=Paste)
  • 310. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 310 helpmenu = Menu(menu) menu.add_cascade(label="Help",menu=helpmenu) helpmenu.add_command(label="About...",command=About) frame = Frame(root) # creating other widgets text = Text(frame,bg="white") sb = Scrollbar(frame) text["yscrollcommand"] = sb.set sb["command"] = text.yview text.pack(side=LEFT,fill=BOTH) # packing sb.pack(side=RIGHT,fill=Y) frame.pack(fill=BOTH) root.mainloop()
  • 311. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 311 8.3 Extens˜es: Tix, BLT, Wxpython e o 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´ tornar-se o padr˜o; Home a a page: http://wxpython.org; Python Mega Widgets Conjunto de widgets mais sofisticados; Home page: http://pmw.sourceforge.net;
  • 312. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 312 8.4 Programa¸˜o Visual com Tk ca VTCL Programa¸˜o visual em Tcl/Tk; Home page: ca http://vtcl.sourceforge.net.
  • 313. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 313