Implementação de Aplicações Móveis e Jogos com Python - Aula 4

Post on 18-Dec-2014

5.743 views 1 download

description

Implementação de Aplicações Móveis e Jogos com Python

Transcript of Implementação de Aplicações Móveis e Jogos com Python - Aula 4

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!