SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
Python para Maemo
       Osvaldo Santana Neto
       osantana@triveos.com


          Baseado nas apresentações de:
  Lauro Moura <lauro.moura@openbossa.org>
  Raul Fernandes <raul@embedded.ufcg.edu.br>
Instituto Nokia de Tecnologia

• Instituição 2002 fins lucrativos, fundada pela
  Nokia em
              sem

• Investimentos da lei de informática
• Escritórios em Manaus, Brasília e Recife
• Pesquisa eEletrônicos, Software, Multimídia,e
  Produtos
             Desenvolvimento em Mecânica

  Telecomunicações e em Operações e
  Logística
Osvaldo Santana Neto
• Sócio fundador da Triveos Tecnologia Ltda.
• Trabalhou para as empresas: Conectiva
  (Mandriva), Instituto Nokia de Tecnologia,
  Objective Solutions, Haxent, ...
• Responsável pela criação do projeto Python
  para Maemo no INdT em 2005
• http://www.pythonologia.org/
Requisitos

• Conhecimentos em Python
• Conhecimentos em Linux
• VMWare
• Imagem Maemo SDK obtida em:
  http://maemovmware.garage.maemo.org/
Desejável


• Conhecimentos de PyGTK
• Um Internet Tablet (N770, N800, N810)
Internet Tablets




Dispositivos portáteis voltados para uso da Internet.
Nokia N800
•   OMAP 2420

•   ARM11 330MHz

•   800x480x16

•   WLAN, Bluetooth, USB

•   Câmera VGA

•   2x cartões SD
Nokia N810
        •   OMAP 2420
        •   ARM11 400MHz
        •   800x480x16
        •   WLAN,
            Bluetooth, USB
        •   Câmera VGA
        •   1x cartão miniSD
        •   GPS
        •   Teclado
• Plataforma desenvolvida pela Nokia para
  equipar a sua linha de Internet Tablets
• Baseada no Debian Linux
• Utiliza uma série de componentes
  conhecidos no universo do Software Livre
Ambiente de
    Desenvolvimento
• Scratchbox
 • Ambiente para cross-compiling
 • SDK_X86 - arquitetura ‘host’
 • SDK_ARMEL - arquitetura do dispositivo
• Xephyr
 • Servidor X para emulação da interface
    gráfica
Iniciando o ambiente
• Entrando no Scratchbox:
  • /scratchbox/login ou
• Iniciando os serviços:
  • af-sb-init.sh start
• Executando aplicações gráficas:
  • run-standalone.sh programa
A primeira impressão...
Python para Maemo
• Principal alternativa à linguagem C para
  desenvolvimento na plataforma
• Bastante difundida no mundo do Software
  Livre
• Mantido pelo INdT de Recife
• http://pymaemo.garage.maemo.org
Projetos em Python
       Canola
Projetos em Python
       Carman
Bibliotecas Python
•   Gerais                  •   PIL

    •   PyGTK/Gobject       •   Gnome VFS/GConf

    •   D-BUS           •   Específicas Maemo

    •   GStreamer           •   Hildon

    •   Bluez               •   LibOSSO

    •   Pyrex               •   OSSO-Addressbook
Easy
• Facilita ainda mais o desenvolvimento para
  Maemo
• Desenvolvido pela UFCG com apoio do
  INdT
• Incorpora a biblioteca Eagle para desenho
  de Interfaces gráficas
• http://easy.garage.maemo.org/
Vamos começar...
Aplicação de exemplo
• Lista de tarefas
• Adicionar Tarefas
• Remover Tarefas
• Editar Tarefas
• Marcá-las como ‘prontas’
• Gravar as informações automaticamente
Lembretes importantes

• Use sempre:
 •python2.5
• O easy não vem instalado por padrão
 • Adicione...
   deb http://repository.maemo.org/extras-devel diablo free non-free

 • ... no /etc/apt/sources.list
 • apt-get install easy
Módulos &
      Armazenamento

#!/usr/bin/env python2.5

import shelve
from easy import ui

storage = shelve.open(quot;tasks.datquot;, 'c')
Definindo a Tabela

table = ui.Table(
      id=quot;todo_tablequot;,
      headers=(quot;Donequot;, quot;Descriptionquot;),
      types=(bool, str),
      editable=True,
      data_changed_callback=change_task,
)
Manipulando a tabela
def change_task(app, table, data):
  global storage

 key, task = data

 if task is None:
   del storage[str(key)]
 else:
   storage[str(key)] = tuple(task)
 storage.sync()
Tela principal
ui.App(
  id=quot;todo_appquot;,
  title=quot;To Do Listquot;,
  center=(table,),
  bottom=(
    ui.Button(
      id=quot;quit_buttonquot;,
      label=quot;_Quitquot;,
      expand_policy=ui.ExpandPolicy.All(),
      callback=exit)))
Fechar a aplicação


 def exit(app, widget):
   storage.close()
   app.close()
Populando a tabela

def populate_table():
  global storage
  global table

 ks = int(k) for k in storage.keys()
 for k in sorted(ks):
   table.append( storage[str(k)] )
Rodando


if __name__ == quot;__main__quot;:
  populate_table()
  ui.run()
Hora de executar...

SDK_X86:~> run-standalone.sh python2.5 tasks.py
... e pronto.
Portando uma aplicação
A Aplicação




   Desktop
A Aplicação




Maemo sem adaptação...
Passo a passo do porte

• Substituir
  gtk.Window(gtk.WINDOW_TOPLEVEL) por
  hildon.Window()

• Fazer ‘reparent’ dos menus e toolbars
• Substituir diálogos GTK+ pelos do Hildon
• Adaptações para espaço reduzido na tela
Substituindo a Window
@@ -26,6 +26,7 @@
 pygtk.require('2.0')
 import gtk
 import gtk.gdk
+import hildon
 import os
 import sys, getopt
 import ConfigParser
@@ -478,7 +479,7 @@
 
 
 
 quot;quot;quot;

 
   
   # Create interface
-
   
   self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+
   
   self.window = hildon.Window()
 
   
   self.update_title()
 
   
   icon_path = self.find_path('mirage.png')
 
   
   try:
Novos pais para o Menu

@@   -498,7 +498,10 @@
 
   
 self.refresh_recent_files_menu()
 

    self.window.add_accel_group(self.UIManager.get_accel_group())
 
   
 self.menubar = self.UIManager.get_widget('/MainMenu')
-
   
 vbox.pack_start(self.menubar, False, False, 0)
+
   
 self.menu = gtk.Menu()
+
   
 for item in self.menubar:
+
   
 
 item.reparent(self.menu)
+
   
 self.window.set_menu(self.menu)
 
   
 self.set_slideshow_sensitivities()
 
   
 self.toolbar = self.UIManager.get_widget('/MainToolbar')
 
   
 vbox.pack_start(self.toolbar, False, False, 0)
A barra de ferramentas

@@   -504,7 +504,7 @@
 
   
 self.window.set_menu(self.menu)
 
   
 self.set_slideshow_sensitivities()
 
   
 self.toolbar = self.UIManager.get_widget('/MainToolbar')
-
   
 vbox.pack_start(self.toolbar, False, False, 0)
+
   
 self.window.add_toolbar(self.toolbar)
 
   
 self.layout = gtk.Layout()
 
   
 self.vscroll = gtk.VScrollbar(None)
 
   
 self.vscroll.set_adjustment(self.layout.get_vadjustment())
O diálogo correto
@@ -1353,7 +1353,7 @@
 
 
 
 self.save_image_now(self.currimg_name, gtk.gdk.pixuf_...

 
 def save_image_as(self, action):
-
 
 dialog = gtk.FileChooserDialog(title=_(quot;Save
Asquot;),action=gtk.FILE_CHOOSER_ACTION_SAVE,buttons=(gtk.STOCK_CANC
EL,gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE,gtk.RESPONSE_OK))
+
 
 dialog =
hildon.FileChooserDialog(self.window,gtk.FILE_CHOOSER_ACTION_SAV
E)
 
 
 dialog.set_default_response(gtk.RESPONSE_OK)
 
 
 filename = os.path.basename(self.currimg_name)
 
 
 filetype = None
Versão final
Distribuição
Pacotes Debian

  distutils



                    Progama &
                 Biblioteca Python
Ajustando os arquivos

setup.py
@@ -23,7 +23,7 @@
 
 
 ext_modules = [Extension('imgfuncs', ['imgfuncs.c'])],
 
 
 scripts = ['mirage'],
 
 
 data_files=[('share/mirage', ['README', 'COPYING',...
-
 
 
 ('share/applications', ['mirage.desktop']),
+
 
 
 ('share/applications/hildon', ['mirage.desktop']),
 
 
 
 ('share/pixmaps', ['mirage.png']),
 
 
 
 ('share/locale/ru/LC_MESSAGES', ['locale/ru/LC_M...
 
 
 
 ('share/locale/pl/LC_MESSAGES', ['locale/pl/LC_M...
Arquivo .desktop
mirage.desktop
@@ -1,10 +1,10 @@
 [Desktop Entry]
 Name=Mirage
 Comment=A fast GTK+ Image Viewer
-Exec=mirage %U
+Exec=mirage
 Terminal=false
 Type=Application
-Icon=mirage.png
+Icon=mirage
 Categories=GTK;Application;Graphics;
 Version=0.8.3
 Encoding=UTF-8
Mais Informações
• http://www.maemo.org
• http://pymaemo.garage.maemo.org
• http://easy.garage.maemo.org
• http://www.pygtk.org
• http://code.google.com/p/eagle-py
• http://openbossa.indt.org/canola
• http://openbossa.indt.org/carman
Contatos
 e-mail: osantana@triveos.com
google talk: osantana@gmail.com

Contenu connexe

Similaire à Python Maemo Apps

Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoFreedom DayMS
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaChrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaJoselito Nascimento
 
EIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de SoftwareEIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de SoftwareAldson Diego
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanElton Minetto
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlDiego Tremper
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlManuel Lemos
 
Integracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControlIntegracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControlDiego Tremper
 
Adeus Wordpress. Ola Pelican!
Adeus Wordpress. Ola Pelican!Adeus Wordpress. Ola Pelican!
Adeus Wordpress. Ola Pelican!magnunleno
 
JS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na PráticaJS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na PráticaiMasters
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlDiego Tremper
 
Desenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIDesenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIRudá Almeida
 
isk-daemon: busca visual de imagens para todos
isk-daemon: busca visual de imagens para todosisk-daemon: busca visual de imagens para todos
isk-daemon: busca visual de imagens para todosRicardo Cabral
 
Mantendo a Sanidade com o Glade
Mantendo a Sanidade com o GladeMantendo a Sanidade com o Glade
Mantendo a Sanidade com o GladeMarcelo Lira
 
Oficina Python e Google App Engine
Oficina Python e Google App EngineOficina Python e Google App Engine
Oficina Python e Google App EngineRodrigo Amaral
 
Aplicações Móveis com J2ME
Aplicações Móveis com J2MEAplicações Móveis com J2ME
Aplicações Móveis com J2MEelliando dias
 

Similaire à Python Maemo Apps (20)

Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaChrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
 
Caelum Day In Rio
Caelum Day In RioCaelum Day In Rio
Caelum Day In Rio
 
EIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de SoftwareEIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de Software
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControl
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControl
 
Integracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControlIntegracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControl
 
Adeus Wordpress. Ola Pelican!
Adeus Wordpress. Ola Pelican!Adeus Wordpress. Ola Pelican!
Adeus Wordpress. Ola Pelican!
 
JS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na PráticaJS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na Prática
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControl
 
Desenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIDesenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLI
 
isk-daemon: busca visual de imagens para todos
isk-daemon: busca visual de imagens para todosisk-daemon: busca visual de imagens para todos
isk-daemon: busca visual de imagens para todos
 
Mantendo a Sanidade com o Glade
Mantendo a Sanidade com o GladeMantendo a Sanidade com o Glade
Mantendo a Sanidade com o Glade
 
Oficina Python e Google App Engine
Oficina Python e Google App EngineOficina Python e Google App Engine
Oficina Python e Google App Engine
 
Ruby On Rails Regis
Ruby On Rails RegisRuby On Rails Regis
Ruby On Rails Regis
 
Aplicações Móveis com J2ME
Aplicações Móveis com J2MEAplicações Móveis com J2ME
Aplicações Móveis com J2ME
 
Google apps script - Parte - 1
Google apps script - Parte - 1Google apps script - Parte - 1
Google apps script - Parte - 1
 
Minicurso Java
Minicurso JavaMinicurso Java
Minicurso Java
 

Plus de Osvaldo Santana Neto

Contruindo um Framework Web de Brinquedo só com Python
Contruindo um Framework Web de Brinquedo só com PythonContruindo um Framework Web de Brinquedo só com Python
Contruindo um Framework Web de Brinquedo só com PythonOsvaldo Santana Neto
 
Dave Thomas - Agile is Dead (GOTO 2015)
Dave Thomas - Agile is Dead (GOTO 2015)Dave Thomas - Agile is Dead (GOTO 2015)
Dave Thomas - Agile is Dead (GOTO 2015)Osvaldo Santana Neto
 
Como funciona um time remoto de desenvolvimento - Caipyra 2018
Como funciona um time remoto de desenvolvimento - Caipyra 2018Como funciona um time remoto de desenvolvimento - Caipyra 2018
Como funciona um time remoto de desenvolvimento - Caipyra 2018Osvaldo Santana Neto
 
Escalando times através do trabalho remoto
Escalando times através do trabalho remotoEscalando times através do trabalho remoto
Escalando times através do trabalho remotoOsvaldo Santana Neto
 
Plataforma distribuída de Microserviços ou, como a Olist funciona
Plataforma distribuída de Microserviços ou, como a Olist funcionaPlataforma distribuída de Microserviços ou, como a Olist funciona
Plataforma distribuída de Microserviços ou, como a Olist funcionaOsvaldo Santana Neto
 
Real Life Hackers @ PechaKucha 20x20
Real Life Hackers @ PechaKucha 20x20Real Life Hackers @ PechaKucha 20x20
Real Life Hackers @ PechaKucha 20x20Osvaldo Santana Neto
 
De Zero à Web com Python e Django
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e DjangoOsvaldo Santana Neto
 
Entendiendo Unicode (Facundo Batista)
Entendiendo Unicode (Facundo Batista)Entendiendo Unicode (Facundo Batista)
Entendiendo Unicode (Facundo Batista)Osvaldo Santana Neto
 
Como me tornei um empreendedor pythonista
Como me tornei um empreendedor pythonistaComo me tornei um empreendedor pythonista
Como me tornei um empreendedor pythonistaOsvaldo Santana Neto
 
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)Osvaldo Santana Neto
 
Ludeos - Venda seu conteúdo online (how it works)
Ludeos - Venda seu conteúdo online (how it works)Ludeos - Venda seu conteúdo online (how it works)
Ludeos - Venda seu conteúdo online (how it works)Osvaldo Santana Neto
 
App Engine: aplicações escaláveis em poucas horas
App Engine: aplicações escaláveis em poucas horasApp Engine: aplicações escaláveis em poucas horas
App Engine: aplicações escaláveis em poucas horasOsvaldo Santana Neto
 

Plus de Osvaldo Santana Neto (20)

Basic Brainf*ck
Basic Brainf*ckBasic Brainf*ck
Basic Brainf*ck
 
Contruindo um Framework Web de Brinquedo só com Python
Contruindo um Framework Web de Brinquedo só com PythonContruindo um Framework Web de Brinquedo só com Python
Contruindo um Framework Web de Brinquedo só com Python
 
A Web é uma API
A Web é uma APIA Web é uma API
A Web é uma API
 
Dave Thomas - Agile is Dead (GOTO 2015)
Dave Thomas - Agile is Dead (GOTO 2015)Dave Thomas - Agile is Dead (GOTO 2015)
Dave Thomas - Agile is Dead (GOTO 2015)
 
Olist Architecture v2.0
Olist Architecture v2.0Olist Architecture v2.0
Olist Architecture v2.0
 
Advanced Brainf*ck
Advanced Brainf*ckAdvanced Brainf*ck
Advanced Brainf*ck
 
Corrigindo Bugs no CPython
Corrigindo Bugs no CPythonCorrigindo Bugs no CPython
Corrigindo Bugs no CPython
 
Como funciona um time remoto de desenvolvimento - Caipyra 2018
Como funciona um time remoto de desenvolvimento - Caipyra 2018Como funciona um time remoto de desenvolvimento - Caipyra 2018
Como funciona um time remoto de desenvolvimento - Caipyra 2018
 
Escalando times através do trabalho remoto
Escalando times através do trabalho remotoEscalando times através do trabalho remoto
Escalando times através do trabalho remoto
 
Plataforma distribuída de Microserviços ou, como a Olist funciona
Plataforma distribuída de Microserviços ou, como a Olist funcionaPlataforma distribuída de Microserviços ou, como a Olist funciona
Plataforma distribuída de Microserviços ou, como a Olist funciona
 
Real Life Hackers @ PechaKucha 20x20
Real Life Hackers @ PechaKucha 20x20Real Life Hackers @ PechaKucha 20x20
Real Life Hackers @ PechaKucha 20x20
 
De Zero à Web com Python e Django
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e Django
 
TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
Curso de Python e Django
Curso de Python e DjangoCurso de Python e Django
Curso de Python e Django
 
Entendiendo Unicode (Facundo Batista)
Entendiendo Unicode (Facundo Batista)Entendiendo Unicode (Facundo Batista)
Entendiendo Unicode (Facundo Batista)
 
Como me tornei um empreendedor pythonista
Como me tornei um empreendedor pythonistaComo me tornei um empreendedor pythonista
Como me tornei um empreendedor pythonista
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
 
Ludeos - Venda seu conteúdo online (how it works)
Ludeos - Venda seu conteúdo online (how it works)Ludeos - Venda seu conteúdo online (how it works)
Ludeos - Venda seu conteúdo online (how it works)
 
App Engine: aplicações escaláveis em poucas horas
App Engine: aplicações escaláveis em poucas horasApp Engine: aplicações escaláveis em poucas horas
App Engine: aplicações escaláveis em poucas horas
 

Python Maemo Apps

  • 1. Python para Maemo Osvaldo Santana Neto osantana@triveos.com Baseado nas apresentações de: Lauro Moura <lauro.moura@openbossa.org> Raul Fernandes <raul@embedded.ufcg.edu.br>
  • 2. Instituto Nokia de Tecnologia • Instituição 2002 fins lucrativos, fundada pela Nokia em sem • Investimentos da lei de informática • Escritórios em Manaus, Brasília e Recife • Pesquisa eEletrônicos, Software, Multimídia,e Produtos Desenvolvimento em Mecânica Telecomunicações e em Operações e Logística
  • 3. Osvaldo Santana Neto • Sócio fundador da Triveos Tecnologia Ltda. • Trabalhou para as empresas: Conectiva (Mandriva), Instituto Nokia de Tecnologia, Objective Solutions, Haxent, ... • Responsável pela criação do projeto Python para Maemo no INdT em 2005 • http://www.pythonologia.org/
  • 4. Requisitos • Conhecimentos em Python • Conhecimentos em Linux • VMWare • Imagem Maemo SDK obtida em: http://maemovmware.garage.maemo.org/
  • 5. Desejável • Conhecimentos de PyGTK • Um Internet Tablet (N770, N800, N810)
  • 6. Internet Tablets Dispositivos portáteis voltados para uso da Internet.
  • 7. Nokia N800 • OMAP 2420 • ARM11 330MHz • 800x480x16 • WLAN, Bluetooth, USB • Câmera VGA • 2x cartões SD
  • 8. Nokia N810 • OMAP 2420 • ARM11 400MHz • 800x480x16 • WLAN, Bluetooth, USB • Câmera VGA • 1x cartão miniSD • GPS • Teclado
  • 9. • Plataforma desenvolvida pela Nokia para equipar a sua linha de Internet Tablets • Baseada no Debian Linux • Utiliza uma série de componentes conhecidos no universo do Software Livre
  • 10. Ambiente de Desenvolvimento • Scratchbox • Ambiente para cross-compiling • SDK_X86 - arquitetura ‘host’ • SDK_ARMEL - arquitetura do dispositivo • Xephyr • Servidor X para emulação da interface gráfica
  • 11. Iniciando o ambiente • Entrando no Scratchbox: • /scratchbox/login ou • Iniciando os serviços: • af-sb-init.sh start • Executando aplicações gráficas: • run-standalone.sh programa
  • 13. Python para Maemo • Principal alternativa à linguagem C para desenvolvimento na plataforma • Bastante difundida no mundo do Software Livre • Mantido pelo INdT de Recife • http://pymaemo.garage.maemo.org
  • 16. Bibliotecas Python • Gerais • PIL • PyGTK/Gobject • Gnome VFS/GConf • D-BUS • Específicas Maemo • GStreamer • Hildon • Bluez • LibOSSO • Pyrex • OSSO-Addressbook
  • 17. Easy • Facilita ainda mais o desenvolvimento para Maemo • Desenvolvido pela UFCG com apoio do INdT • Incorpora a biblioteca Eagle para desenho de Interfaces gráficas • http://easy.garage.maemo.org/
  • 19. Aplicação de exemplo • Lista de tarefas • Adicionar Tarefas • Remover Tarefas • Editar Tarefas • Marcá-las como ‘prontas’ • Gravar as informações automaticamente
  • 20. Lembretes importantes • Use sempre: •python2.5 • O easy não vem instalado por padrão • Adicione... deb http://repository.maemo.org/extras-devel diablo free non-free • ... no /etc/apt/sources.list • apt-get install easy
  • 21. Módulos & Armazenamento #!/usr/bin/env python2.5 import shelve from easy import ui storage = shelve.open(quot;tasks.datquot;, 'c')
  • 22. Definindo a Tabela table = ui.Table( id=quot;todo_tablequot;, headers=(quot;Donequot;, quot;Descriptionquot;), types=(bool, str), editable=True, data_changed_callback=change_task, )
  • 23. Manipulando a tabela def change_task(app, table, data): global storage key, task = data if task is None: del storage[str(key)] else: storage[str(key)] = tuple(task) storage.sync()
  • 24. Tela principal ui.App( id=quot;todo_appquot;, title=quot;To Do Listquot;, center=(table,), bottom=( ui.Button( id=quot;quit_buttonquot;, label=quot;_Quitquot;, expand_policy=ui.ExpandPolicy.All(), callback=exit)))
  • 25. Fechar a aplicação def exit(app, widget): storage.close() app.close()
  • 26. Populando a tabela def populate_table(): global storage global table ks = int(k) for k in storage.keys() for k in sorted(ks): table.append( storage[str(k)] )
  • 27. Rodando if __name__ == quot;__main__quot;: populate_table() ui.run()
  • 28. Hora de executar... SDK_X86:~> run-standalone.sh python2.5 tasks.py
  • 31. A Aplicação Desktop
  • 32. A Aplicação Maemo sem adaptação...
  • 33. Passo a passo do porte • Substituir gtk.Window(gtk.WINDOW_TOPLEVEL) por hildon.Window() • Fazer ‘reparent’ dos menus e toolbars • Substituir diálogos GTK+ pelos do Hildon • Adaptações para espaço reduzido na tela
  • 34. Substituindo a Window @@ -26,6 +26,7 @@ pygtk.require('2.0') import gtk import gtk.gdk +import hildon import os import sys, getopt import ConfigParser @@ -478,7 +479,7 @@ quot;quot;quot; # Create interface - self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) + self.window = hildon.Window() self.update_title() icon_path = self.find_path('mirage.png') try:
  • 35. Novos pais para o Menu @@ -498,7 +498,10 @@ self.refresh_recent_files_menu() self.window.add_accel_group(self.UIManager.get_accel_group()) self.menubar = self.UIManager.get_widget('/MainMenu') - vbox.pack_start(self.menubar, False, False, 0) + self.menu = gtk.Menu() + for item in self.menubar: + item.reparent(self.menu) + self.window.set_menu(self.menu) self.set_slideshow_sensitivities() self.toolbar = self.UIManager.get_widget('/MainToolbar') vbox.pack_start(self.toolbar, False, False, 0)
  • 36. A barra de ferramentas @@ -504,7 +504,7 @@ self.window.set_menu(self.menu) self.set_slideshow_sensitivities() self.toolbar = self.UIManager.get_widget('/MainToolbar') - vbox.pack_start(self.toolbar, False, False, 0) + self.window.add_toolbar(self.toolbar) self.layout = gtk.Layout() self.vscroll = gtk.VScrollbar(None) self.vscroll.set_adjustment(self.layout.get_vadjustment())
  • 37. O diálogo correto @@ -1353,7 +1353,7 @@ self.save_image_now(self.currimg_name, gtk.gdk.pixuf_... def save_image_as(self, action): - dialog = gtk.FileChooserDialog(title=_(quot;Save Asquot;),action=gtk.FILE_CHOOSER_ACTION_SAVE,buttons=(gtk.STOCK_CANC EL,gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE,gtk.RESPONSE_OK)) + dialog = hildon.FileChooserDialog(self.window,gtk.FILE_CHOOSER_ACTION_SAV E) dialog.set_default_response(gtk.RESPONSE_OK) filename = os.path.basename(self.currimg_name) filetype = None
  • 39. Distribuição Pacotes Debian distutils Progama & Biblioteca Python
  • 40. Ajustando os arquivos setup.py @@ -23,7 +23,7 @@ ext_modules = [Extension('imgfuncs', ['imgfuncs.c'])], scripts = ['mirage'], data_files=[('share/mirage', ['README', 'COPYING',... - ('share/applications', ['mirage.desktop']), + ('share/applications/hildon', ['mirage.desktop']), ('share/pixmaps', ['mirage.png']), ('share/locale/ru/LC_MESSAGES', ['locale/ru/LC_M... ('share/locale/pl/LC_MESSAGES', ['locale/pl/LC_M...
  • 41. Arquivo .desktop mirage.desktop @@ -1,10 +1,10 @@ [Desktop Entry] Name=Mirage Comment=A fast GTK+ Image Viewer -Exec=mirage %U +Exec=mirage Terminal=false Type=Application -Icon=mirage.png +Icon=mirage Categories=GTK;Application;Graphics; Version=0.8.3 Encoding=UTF-8
  • 42. Mais Informações • http://www.maemo.org • http://pymaemo.garage.maemo.org • http://easy.garage.maemo.org • http://www.pygtk.org • http://code.google.com/p/eagle-py • http://openbossa.indt.org/canola • http://openbossa.indt.org/carman