SlideShare una empresa de Scribd logo
1 de 43
Descargar para leer sin conexión
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

Más contenido relacionado

Similar a Python Para Maemo

Aplicações Móveis com J2ME
Aplicações Móveis com J2MEAplicações Móveis com J2ME
Aplicações Móveis com J2ME
elliando dias
 

Similar a Python Para Maemo (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
 

Más de 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 pythonista
Osvaldo 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
 

Más 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
 

Último

Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
Natalia Granato
 

Último (6)

ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 

Python Para Maemo

  • 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