Upload
flavio-ribeiro
View
5.743
Download
1
Embed Size (px)
DESCRIPTION
Implementação de Aplicações Móveis e Jogos com Python
Citation preview
Implementação de Aplicações Móveis e Jogos com Python
Review
3ª Aula Mais appuifw
Title, body, menus Teclado Graphics e Canvas Data Handling Um pouco de jogos :-)
Pra Hoje...
4ª Aula Fim do Appuifw
Forms e tabs
Exercícios
Bluetooth Networking Camera O módulo sysinfo Dicas de um Projeto
Definição dos grupos e Projetos
Appuifw:Forms e Tabs
Appuifw.Form
appuifw.Form
Objeto de formulários da s60
Recebe no construtor uma lista de tuplas eseu tipo de edição.
(nome,tipo[,valor default]) Nome é um unicode Tipo pode ser:
'text' 'number' 'date' 'time' 'combo' 'float'
Appuifw.Form
appuifw.Form
Objeto de formulários da s60
Tem os seguintes atributos
Flags FFormEditModeOnly – Aceita edição FFormViewModeOnly – Não aceita edição
Menu Recebe uma lista de tuplas (titulo, callback)
Callback é uma referencia a função Titulo é um unicode
Appuifw.Form
appuifw.Form
Objeto de formulários da s60
Tem os seguintes Métodos
Execute() Apresenta a Form na UI
insert() Insere itens ao Form
Pop() e length()
save_hook()
Appuifw.Form
import appuifwmodelos = [u'e61',u'xpressmusic',u'iphone']fields = [(u'Company','text'), (u'Model', 'combo', (modelos,0))]myForm = appuifw.Form( fields, flags=appuifw.FFormEditModeOnly)myForm.execute()
Exemplo 1
Appuifw.Form
import appuifw, time models = [u"6600", u"6630", u"7610", u"N90", u"N70"] fields = [(u"Company", 'text', u"Nokia"), (u"Model", 'combo', (models, 0)), (u"Amount",'number', 1), (u"Date", 'date', time.time()), (u"Time", 'time')]
saved = False def save(arg):
global savedsaved = Truereturn True
myForm = appuifw.Form(fields, flags=appuifw.FFormEditModeOnly) myForm.save_hook = save myForm.execute() if saved == True:
print myForm[0][2], models[myForm[1][2][1]], myForm[2][2]print time.strftime("%d/%m/%Y", time.localtime(myForm[3][2]))print time.strftime(time.ctime(myForm[4][2])[11:20])
Exemplo 2
PyS60 – Exercício 1
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 – Exercício 2
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.
PyS60 – Exercício 3
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).
Bluetooth
Bluetooth
OBEX (OBject EXchange) Protocolo Bluetooth voltado pra transmissão de arquivos (audio,
imagem, etc)
Bluetooth
OBEX (OBject EXchange) Protocolo Bluetooth voltado pra transmissão de arquivos (audio,
imagem, etc) Para scan de dispositivos OBEX:
import socketendereco, servicos = socket.bt_obex_discover()print endereco,servicos
Bluetooth Enviando uma foto
import camera, e32, socket, appuifwfoto = u"C:\\Images\\arquivo_foto.jpg"
def enviar_foto(): address, services = socket.bt_obex_discover() if u'OBEX Object Push' in services: channel = services[u'OBEX Object Push'] socket.bt_obex_send_file(address, channel, arquivo_foto) appuifw.note(u"Foto enviada!", "info") else: appuifw.note(u"Dispositivo não preparado.", "error")
def tirar_foto(): photo = camera.take_photo() canvas.blit(photo) photo.save(arquivo_foto)
def quit(): app_lock.signal()
canvas = appuifw.Canvas()appuifw.app.body = canvasappuifw.app.exit_key_handler = quitappuifw.app.menu = [(u"Tirar Foto", tirar_foto), (u"Enviar", enviar_foto)]app_lock = e32.Ao_lock()app_lock.wait()
RFCOMM (Radio Frequency COMMunication) Protocolo Bluetooth para transmissão (RX e TX) de texto ou
raw data
Bluetooth
RFCOMM (Radio Frequency COMMunication) Protocolo Bluetooth para transmissão (RX e TX) de texto ou
raw data Para scan de dispositivos RFCOMM:
Bluetooth
import socketendereco, servicos = socket.bt_discover()print endereco,servicos
Bluetooth
Fazendo um CHAT – Lado Servidor
import socket, appuifw
def chat_server(): server = socket.socket(socket.AF_BT, socket.SOCK_STREAM) channel = socket.bt_rfcomm_get_available_server_channel(server) server.bind(("", channel)) server.listen(1) socket.bt_advertise_service(u"NossoChat", server, True, socket.RFCOMM) socket.set_security(server, socket.AUTH | socket.AUTHOR) appuifw.note(u”Esperando Conexão”) conn, client_addr = server.accept() appuifw.note(u”Conectado!”) talk(conn, None)
Bluetooth
Fazendo um CHAT – Lado Cliente
def chat_client(): conn = socket.socket(socket.AF_BT, socket.SOCK_STREAM) address, services = socket.bt_discover() if 'NossoChat' in services: channel = services[u'btchat'] conn.connect((address, channel)) appuifw.note(u”Conectado!”) talk(None, conn) else: appuifw.note(u"O celular não está rodando o chat.", "error")
Bluetooth Fazendo um CHAT – Comum
def receive_msg(fd): print "Esperando a mensagem.." reply = fd.readline() print "Recebido: " + reply appuifw.note(unicode(reply), "info")
def send_msg(fd): msg = appuifw.query(u"Envie:", "text") print "Enviado: " + msg print >> fd, msg
def talk(client, server): try: if server: fd = server.makefile("rw", 0) receive_msg(fd) if client: fd = client.makefile("rw", 0) while True: send_msg(fd) receive_msg(fd
except: appuifw.note(u"Desconectou", "info") if client: client.close() if server: server.close()
index = appuifw.popup_menu([u"Servir", u"Conectar"])if index != None: if index: chat_client() else: chat_server()
Networking
Networking
Maneiras de acessar servidores Computação Distribuída
Módulos de Acesso httplib, urllib (core) json.py (Patric Logan)
http://meu-ip/json.py
Networking
Fazendo um simples download
import urllib
url = “http://pagina/arquivo.html”arquivo = “C:\\Data\\arquivo.txt”
urllib.urlretrieve(url, arquivo)
Networking
Comunicando-se através de POST Lado Cliente (Celular)
import httplib, urllib, appuifw
def senddata():params = urllib.urlencode({'data': "Flavio"})headers = {"Content-type": "application/x-www-form-urlencoded","Accept":
"text/plain"}conn = httplib.HTTPConnection("www.flavioribeiro.com")appuifw.note(u'Espere...')conn.request("POST", "/exemplo.php", params, headers)response = conn.getresponse()uniresponse = unicode(response.read())conn.close()appuifw.note(uniresponse)
senddata()
Networking
Comunicando-se através de POST Lado Servidor (PHP!)
<?php$data = $_REQUEST['data'];$filename = 'textfile.txt';$handle = fopen($filename, 'a+');$text="\n";fwrite($handle, $data);fwrite($handle, $text);echo 'Post com Sucesso!';fclose($handle);?>
Série 'Network Programming for s60'do Marcelo Barros
http://croozeus.com/
Camera
Camera
Módulo responsável por interação direta com a(s) camera(s)
Alguns métodos:
cameras_available() image_modes() flash_modes() max_zoom() take_photo()
Camera
ViewFinder Feedback pro usuário sobre a posição da imagem
import camera, appuifw, e32
def viewfinder(img): canvas.blit(img)
def quit(): camera.stop_finder() lock.signal()
appuifw.app.body = canvas = appuifw.Canvas()appuifw.app.exit_key_handler = quitcamera.start_finder(viewfinder)lock = e32.Ao_lock()lock.wait()
Camera
ViewFinder Feedback pro usuário sobre a posição da imagem
Camera
camera.take_photo() Retorna um objeto graphics.Image
import camera
foto = camera.take_photo()foto.save(“C:\\Images\\foto.jpg”)
O módulo sysinfo
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
Dicas de Organizaçãode um Projeto
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)
Projetos!