Antes de Comecar
Interpretador Interativo Maquina de testes de código Python
Escolha uma IDE! http://www.python.org.br/wiki/IdesPython Ou o velho Notepad >:)
Review
2ª Aula Orientação a Objetos com Python
Classes Métodos (construtor) Atributos
Herança Módulos e Bibliotecas SDK s60 e Python Introdução ao pys60
Appuifw
Algumas Referências!
PyS60
Exemplo Titulo
import appuifw, e32
def quit(): app_lock.signal()
appuifw.app.exit_key_handler=quit
appuifw.app.title=u"Meu Titulo!"
app_lock=e32.Ao_lock()
app_lock.wait()
PyS60 – Estrutura de uma Aplicação appuifw
appuifw.app.body
Pode ser: Canvas Form Listbox Text
Área pode ser aumentada! appuifw.app.screen = 'full' appuifw.app.screen = 'large' appuifw.app.screen = 'normal'
PyS60
Exemplo Body
import appuifw, e32
def quit(): app_lock.signal()
appuifw.app.exit_key_handler=quit
t=appuifw.Text()appuifw.app.body=t
t.add(u"Texto aqui..")t.clear()t.set(u"Texto inteiro.")t.get()
PyS60 Exemplo Menu
import appuifw, e32
def quit(): app_lock.signal()
appuifw.app.exit_key_handler=quit
def callback_A():print "A"
def callback_C():print "C"
def callback_D():print "D"
appuifw.app.menu=[(u"Item_A", callback_A), (u"Item_B", ((u"Item_C", callback_C), (u"Item_D", callback_D)))]
app_lock=e32.Ao_lock()app_lock.wait()
PyS60 Exemplo Menu
import appuifw, e32
def quit(): app_lock.signal()
appuifw.app.exit_key_handler=quit
def callback_A():print "A"
def callback_C():print "C"
def callback_D():print "D"
i=appuifw.popup_menu([u"Item1", u"Item2"])
app_lock=e32.Ao_lock()app_lock.wait()
PyS60 Exemplo Menu
import appuifw, e32
def quit(): app_lock.signal()
appuifw.app.exit_key_handler=quit
def callback_A():print "A"
def callback_C():print "C"
def callback_D():print "D"
i=appuifw.selection_list([u"Item1", u"Item2"])
app_lock=e32.Ao_lock()app_lock.wait()
PyS60 Exemplo Menuimport appuifw, e32
def quit(): app_lock.signal()
appuifw.app.exit_key_handler=quit
def callback_A():print "A"
def callback_C():print "C"
def callback_D():print "D"
i=appuifw.multi_selection_list([u"Item1", u"Item2"], style='checkbox', search_field=1)
app_lock=e32.Ao_lock()app_lock.wait()
PyS60 - Teclado
Exerc cio!í
Crie uma Agenda de Contatos. O usuário será capaz de escolher entre adicionar pessoas a agenda (onde o programa pede Nome e Telefone da pessoa) ou buscar pelo nome usando uma multi_selection list.
Ao selecionar o nome da pessoa, o programa deverá imprimir em um appuifw.Text() o Nome da pessoa e o Telefone dela. Ao selecionar o menu novamente o appuifw.Text() deverá ser apagado.
É desejável que o programa utilize Orientação a Objetos.
PyS60 - Teclado
Keyboard
É preciso associar um canvas ao app.body Área drawable Captura eventos do teclado
canvas = appuifw.Canvas()
appuifw.app.body = canvas
PyS60 - Teclado
Exemplo de Usoimport appuifw, key_codes, e32
def keys(event): if event['keycode'] == key_codes.EKeyUpArrow: appuifw.note(u"Up arrow foi pressionado!") elif event['keycode'] == key_codes.EKeyDownArrow: appuifw.note(u"Down Arrow foi pressionado!")
def quit(): app_lock.signal()
canvas = appuifw.Canvas(event_callback = keys)appuifw.app.body = canvasappuifw.app.exit_key_handler = quitapp_lock = e32.Ao_lock()app_lock.wait()
PyS60 - Teclado
Exerc cio!í
Criar uma aplicação que capture eventos do teclado e chame funções da appuifw (query e note, por exemplo.)
É desejável que o programa utilize Orientação a Objetos, com bibliotecas de captura de eventos e de gerência dos callbacks.
Graphics e appuifw.Canvas
Gráficos 2d e 3d
Interface mais customizada
Gerencia Imagens (graphics.Image)
Desenhos Geométricos Elipse, linha, retângulo
appuifw.app.body = appuifw.Canvas()
Graphics e appuifw.Canvas
Gráficos 2d e 3d
Interface mais customizada
Gerencia Imagens (graphics.Image)
Desenhos Geométricos Elipse, linha, retângulo
appuifw.app.body = appuifw.Canvas()
appuifw.Canvas
appuifw.Canvas
Criação de um Canvas no body da aplicação
Callbacks de redraw e event
Dentro do Canvas pode-se criar:
Linhas Poligonos Retângulos Elipse Pontos Textos
O método blit()
Graphics e Canvas Exemploimport graphics, e32, appuifw
app_lock = e32.Ao_lock()
def quit():app_lock.signal()
appuifw.app.exit_key_handler = quit
canvas = appuifw.Canvas()appuifw.app.body = canvasappuifw.app.screen = 'full'canvas.clear(0x339900)
canvas.line((40,50,180,20),0)canvas.rectangle((30,45,110,100), fill=(255,255,255))canvas.ellipse((0,0,100,50), fill=(255,0,0))canvas.text((150,150),u”Texto”,(0,0,0),'title')
app_lock.wait()
Graphics e Canvas
Gerenciando Imagens
graphics.Image + appuifw.Canvas graphics.Image é um buffer Evita “flicks” na tela blit()
graphics.Image resize, transpose, save
Graphics e Canvas Exemplo
import e32,key_codes,graphicsfrom appuifw import *
def draw_rect(): img.rectangle((50,100,100,150), fill = (255,255,0))
def draw_point(): img.point((90,50), outline=(255,0,0),width=30)
def handle_redraw(rect):if img: canvas.blit(img)
def handle_event(event): ev = event[“keycode”] if event[“type”] == EEventKeyDown: img.clear((0,0,255)) if ev == key_codes.EKeyUpArrow: draw_point() elif ev == key_codes.EKeyDownArrow: draw_rect()
def quit(): app_lock.signal()
img = None
canvas = Canvas(redraw_callback = \handle_redraw, event_callback = \handle_event)
app.body = canvasapp.screen = 'full'
app.exit_key_handler = quit
w, h = canvas.size
img = graphics.Image.new((w,h))img.clear((0,0,255))
app_lock = e32.Ao_lock()app_lock.wait()
PyS60 - Teclado
Exerc cio!í
Criar uma aplicação que, a cada evento gerado do joystick, mude a cor do body.
Criar também um menu (popup_menu) com a escolha de escrever um nome (query). Esse nome escrito irá aparecer no meio da tela com a cor preta (usando canvas.text ao invés de appuifw.text).
Data Handling
Gerenciamento de Arquivos e Dados
C: → Memória Interna do Dispositivo D: → RAM (read-only) E: → Cartão de Memória Z: → ROM (read-only)
Fotos C:\Images ou E:\Images
Músicas C:\Sounds ou E:\Sounds
Arquivos C:\Data ou E:\Data
Data Handling
Criando um Diretório para sua Aplicação
import os, os.path
PATH = u”C:\\Data\\MinhaAplicação”if not os.path.exists(PATH): os.makedirs(PATH)
Criando Arquivos
Os modos podem ser:
a → append w → write r → read
Arquivo = open(“C:\\Data\\nomedoarquivo.txt”,”w”)
wb → Escreve binário
Data Handling
Escrevendo e lendo de um Arquivo
arquivo = open(“C:\\Data\\contatos.txt”,”w”)
arquivo.write(“Essa linha será escrita no arquivo.”)arquivo.write(“Essa aqui já sera a segunda linha do arquivo.”)
arquivo.close()
arquivo = open(“C:\\Data\\contatos.txt”,”r”)
for linha in arquivo:print linha
Data Handling
O módulo e32dbm
“Banco de Dados” para Dispositivos Symbian Tratamento semelhante ao de objetos File Trata Dicionários Gerencia arquivos maiores e mais rapidamente
e32dbm.open(DB_FILE, modo)
Modo pode ser:
r → Abre a DB pra leitura w → Abre a DB para escrita c → Leitura e Escrita (Se não existir, cria)
Se 'f' for colocado a frente do modo, as modificações no banco ficam em memória até o close() do db
Data Handling
Exemplo
Import e32dbm
db = e32dbm.open(“C:\\Data\\database.db”,”cf”)
db[“Nome”] = u”Flávio Ribeiro”db[“Idade”] = 21
for key, value in db.items():print “Chave: “, key
print “Valor:”, value
db.close()
Módulo responsável por informações do sistema
sysinfo.battery() Retorna o nivel da bateria (entre 0 e 7)
sysinfo.imei() Retorna o número de identificação do celular
sysinfo.active_profile() Retorna o perfil utilizado no momento (Silencioso, Reunião,
etc)
sysinfo.display_pixels() Retorna o tamanho da tela em pixels (muito importante)
Sysinfo
Módulo responsável por informações do sistema
sysinfo.free_drivespace() Retorna o espaço livre em bytes em cada drive {u'C:': 58463232, u'D:': 9494528, u'Z:': 0}
sysinfo.total_ram() Retorna o tamanho da memória RAM
sysinfo.free_ram() Retorna a memória RAM livre
sysinfo.signal_bars() Retorna o sinal da antena (de 0 a 7)
sysinfo.sw_version() Versão do firmware
Sysinfo
Jogos com Python
API's e Frameworks
PyGlet
PyOpenGL
Panda3D
Pygame Mais popular (também mais difundida) SDL (Simple DirectMedia Layer) Sprites, Actions, Effects Linux, Windows, Mac, XO-OLPC, Maemo, s60
Jogos com Python
Definições
Surface Superfícies a serem desenhadas 2d ou 3d (transparência Em memória ou placa de vídeo
Rect Retângulos Delimitam sprites
Display Manipula a tela pygame.display.flip() Dirty Rect
Jogos com Python
Definições
Draw Desenha no display Linhas, Circulos, Polígonos
Event Recupera eventos do Input (Teclado, Joystick) Delimitam sprites
Clock Define os frames por segundo pygame.clock.tick()
Jogos com Python
Definições
Sprite Agente ativo pygame.sprite.Sprite e pygame.sprite.Group
Colisões Comparação de retângulos dos sprites
Game Loop Loop Infinito
Captura eventos do input Trata os eventos 'Pinta' os sprites nas novas localizações Atualiza a tela (flip() ou update())
Várias funções em um só arquivo Arquivo: operacoes.py Funções:
soma(x,y) subtrai(x,y) divide(x,y)
Namespace e Dicas de um projeto Python
import operacoes
operacoes.soma(10,20)operacoes.divide(100,2)
Várias Classes em um só arquivo Arquivo: funcionarios.py Classes:
Presidente Diretor Estagiario
Namespace e Dicas de um projeto Python
import funcionarios
flavio = funcionarios.Estagiario()
lucas = funcionarios.Presidente()
flavio.trabalha()lucas.toma_cafe()
Métodos trabalha() toma_cafe()
Várias Classes em um só arquivo (Exemplo II) Arquivo: funcionarios.py Classes:
Presidente Diretor Estagiario
Namespace e Dicas de um projeto Python
from funcionarios import *
flavio = Estagiario()
lucas = Presidente()
flavio.trabalha()lucas.toma_cafe()
Métodos trabalha() toma_cafe()
Pacotes Pasta: conexoes/ Arquivo __init__.py (vazio) Arquivos:
bluetooth.py → Classes Server e Client wireless.py → Classes AccessPoint e Client
Namespace e Dicas de um projeto Python
import conexoes.bluetoothimport conexoes.wireless
bt = conexoes.bluetooth.Client()
wifi = conexoes.wireless.AccessPoint()
Pacotes (Exemplo II) Pasta: conexoes/ Arquivo __init__.py (vazio) Arquivos:
bluetooth.py → Classes Server e Client wireless.py → Classes AccessPoint e Client
Namespace e Dicas de um projeto Python
from conexoes import bluetooth
bt = bluetooth.Client()
Pacotes (Exemplo III) Pasta: conexoes/ Arquivo __init__.py (vazio) Arquivos:
bluetooth.py → Classes Server e Client wireless.py → Classes AccessPoint e Client
Namespace e Dicas de um projeto Python
from conexoes.bluetooth import Server
bt = Server()
Dicas: Crie uma pasta pra seu programa:
Deixe uma pasta do seu programa para os códigos (src) Deixe outra pasta para Arquivos no geral (files) Crie outras necessárias
Namespace e Dicas de um projeto Python
import os, os.path
PATH = u”C:\\Data\\MinhaAplicação”if not os.path.exists(PATH): os.makedirs(PATH)
import os, os.path
Sources = u”C:\\Data\\MinhaAplicação\\src”if not os.path.exists(Sources): os.makedirs(Sources)
Dicas: Coloque a pasta de códigos no seu Python Path
Assim ele será visível e poderá ser incluído nos seus códigos.
Namespace e Dicas de um projeto Python
import sys
Sources = u”C:\\Data\\MinhaAplicação\\src”sys.path.append(Sources)