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 e
seu 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 appuifw
modelos = [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 saved
saved = True
return 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 socket
endereco, servicos = socket.bt_obex_discover()
print endereco,servicos
Bluetooth
 Enviando uma foto
import camera, e32, socket, appuifw
foto = u"C:Imagesarquivo_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 = canvas
appuifw.app.exit_key_handler = quit
appuifw.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 socket
endereco, 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:Dataarquivo.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 = quit
camera.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:Imagesfoto.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ção
de 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.bluetooth
import 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:DataMinhaAplicação”
if not os.path.exists(PATH): os.makedirs(PATH)
import os, os.path
Sources = u”C:DataMinhaAplicaçãosrc”
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:DataMinhaAplicaçãosrc”
sys.path.append(Sources)
Projetos!

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

  • 1.
    Implementação de AplicaçõesMóveis e Jogos com Python
  • 2.
    Review  3ª Aula Mais appuifw  Title, body, menus  Teclado  Graphics e Canvas  Data Handling  Um pouco de jogos :-)
  • 3.
    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
  • 4.
  • 5.
    Appuifw.Form  appuifw.Form  Objetode formulários da s60  Recebe no construtor uma lista de tuplas e seu tipo de edição.  (nome,tipo[,valor default])  Nome é um unicode  Tipo pode ser:  'text'  'number'  'date'  'time'  'combo'  'float'
  • 6.
    Appuifw.Form  appuifw.Form  Objetode 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
  • 7.
    Appuifw.Form  appuifw.Form  Objetode 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()
  • 8.
    Appuifw.Form import appuifw modelos =[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
  • 9.
    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 saved saved = True return 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
  • 10.
    PyS60 – Exercício1 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.
  • 11.
    PyS60 – Exercício2 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.
  • 12.
    PyS60 – Exercício3 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).
  • 13.
  • 14.
    Bluetooth  OBEX (OBjectEXchange)  Protocolo Bluetooth voltado pra transmissão de arquivos (audio, imagem, etc)
  • 15.
    Bluetooth  OBEX (OBjectEXchange)  Protocolo Bluetooth voltado pra transmissão de arquivos (audio, imagem, etc)  Para scan de dispositivos OBEX: import socket endereco, servicos = socket.bt_obex_discover() print endereco,servicos
  • 16.
    Bluetooth  Enviando umafoto import camera, e32, socket, appuifw foto = u"C:Imagesarquivo_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 = canvas appuifw.app.exit_key_handler = quit appuifw.app.menu = [(u"Tirar Foto", tirar_foto), (u"Enviar", enviar_foto)] app_lock = e32.Ao_lock() app_lock.wait()
  • 17.
     RFCOMM (RadioFrequency COMMunication)  Protocolo Bluetooth para transmissão (RX e TX) de texto ou raw data Bluetooth
  • 18.
     RFCOMM (RadioFrequency COMMunication)  Protocolo Bluetooth para transmissão (RX e TX) de texto ou raw data  Para scan de dispositivos RFCOMM: Bluetooth import socket endereco, servicos = socket.bt_discover() print endereco,servicos
  • 19.
    Bluetooth  Fazendo umCHAT – 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)
  • 20.
    Bluetooth  Fazendo umCHAT – 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")
  • 21.
    Bluetooth  Fazendo umCHAT – 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()
  • 22.
  • 23.
    Networking  Maneiras deacessar servidores  Computação Distribuída  Módulos de Acesso  httplib, urllib (core)  json.py (Patric Logan)  http://meu-ip/json.py
  • 24.
    Networking  Fazendo umsimples download import urllib url = “http://pagina/arquivo.html” arquivo = “C:Dataarquivo.txt” urllib.urlretrieve(url, arquivo)
  • 25.
    Networking  Comunicando-se atravésde 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()
  • 26.
    Networking  Comunicando-se atravésde 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); ?>
  • 27.
    Série 'Network Programmingfor s60' do Marcelo Barros http://croozeus.com/
  • 28.
  • 29.
    Camera  Módulo responsávelpor interação direta com a(s) camera(s)  Alguns métodos:  cameras_available()  image_modes()  flash_modes()  max_zoom()  take_photo()
  • 30.
    Camera  ViewFinder  Feedbackpro usuário sobre a posição da imagem
  • 31.
    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 = quit camera.start_finder(viewfinder) lock = e32.Ao_lock() lock.wait() Camera  ViewFinder  Feedback pro usuário sobre a posição da imagem
  • 32.
    Camera  camera.take_photo()  Retornaum objeto graphics.Image import camera foto = camera.take_photo() foto.save(“C:Imagesfoto.jpg”)
  • 33.
  • 34.
     Módulo responsávelpor 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
  • 35.
     Módulo responsávelpor 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
  • 36.
  • 37.
     Várias funçõesem 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)
  • 38.
     Várias Classesem 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()
  • 39.
     Várias Classesem 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()
  • 40.
     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.bluetooth import conexoes.wireless bt = conexoes.bluetooth.Client() wifi = conexoes.wireless.AccessPoint()
  • 41.
     Pacotes (ExemploII)  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()
  • 42.
     Pacotes (ExemploIII)  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()
  • 43.
     Dicas:  Crieuma 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:DataMinhaAplicação” if not os.path.exists(PATH): os.makedirs(PATH) import os, os.path Sources = u”C:DataMinhaAplicaçãosrc” if not os.path.exists(Sources): os.makedirs(Sources)
  • 44.
     Dicas:  Coloquea 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:DataMinhaAplicaçãosrc” sys.path.append(Sources)
  • 45.