A maior rede de estudos do Brasil

Grátis
360 pág.
python_para_desenvolvedores_2ed

Pré-visualização | Página 40 de 47

'text-anchor': 'middle',
 'fill': '#%02x%02x%02x' % (c, c - 30, c - 60)}
 xmltexto.set('style', simplestyle.formatStyle(style))
 # Coloca o texto na camada
 camada.append(xmltexto)
if __name__ == '__main__':
 rt = RandomText()
 rt.affect()
Para que o Inkscape reconheça a nova extensão, é necessário criar um arquivo 
XML com a configuração, que informa ao aplicativo os módulos e os 
parâmetros usados pela extensão, incluindo os tipos, limites e valores padrão 
desses parâmetros, para que ele possa interagir com o usuário através de uma 
caixa de dialogo antes da execução para obter os valores desejados. Os 
parâmetros são passados como argumentos na linha de comando quando o 
script é executado.
Arquivo de configuração (randomtext.inx):
<?xml version="1.0" encoding="UTF-8"?>
<inkscape-extension 
xmlns="http://www.inkscape.org/namespace/inkscape/extension">
310 Inkscape
 <_name>RandomText</_name>
 <id>org.ekips.filter.randomtext</id>
 <dependency type="executable" 
location="extensions">randomtext.py</dependency>
 <dependency type="executable" 
location="extensions">inkex.py</dependency>
 <param name="texto" type="string" _gui-text="Texto">Python</param>
 <param name="quantidade" type="int" min="1" max="500" _gui-
text="Quantidade">20</param>
 <param name="largura" type="int" min="1" max="10000" _gui-
text="Largura">1000</param>
 <param name="altura" type="int" min="1" max="10000" _gui-
text="Altura">1000</param>
 <effect>
 <object-type>all</object-type>
 <effects-menu>
 <submenu _name="Render"/>
 </effects-menu>
 </effect>
 <script>
 <command reldir="extensions" 
interpreter="python">randomtext.py</command>
 </script>
</inkscape-extension>
Janela com os parâmetros da extensão:
Exemplo de saída (quantidade igual a 100, largura igual a 600 e altura igual a 
200):
Inkscape 311
Tanto o programa quanto o arquivo de configuração precisam ficar na pasta 
de extensões (share\extensions, dentro da pasta de instalação, para a versão 
Windows) para que sejam encontrados pelo aplicativo e o nome do arquivo 
de configuração precisa ter extensão “.inx”.
312 BrOffice.org
BrOffice.org
BrOffice.org98 é um conhecido pacote de automação de escritórios de código 
aberto, que inclui editor de textos, planilha e outros aplicativos. Além disso, o 
BrOffice.org também suporta Python (entre outras linguagens):
▪ Como linguagem de macro, permitindo a automatização de tarefas.
▪ Para a construção de extensões (add ons).
▪ Em um serviço para atender conexões, através de uma API chamada 
UNO (Universal Network Objects).
Exemplo de macro:
# -*- coding: latin1 -*-
# A macro deve ser executada a partir do
# BrOffice.org Calc
def plan():
 """
 Preenche uma planilha
 """
 # Obtêm o documento para o contexto de script
 doc = XSCRIPTCONTEXT.getDocument()
 # A primeira planilha do documento
 sheet = doc.getSheets().getByIndex(0)
 col = lin = 0
 a = ord('A')
 # Cria uma linha com os títulos para as colunas
 for titulo in ('Jan', 'Fev', 'Mar', 'Total'):
 col += 1
 sheet.getCellByPosition(col, lin).setString(titulo)
 # E coloca uma fórmula com somatório na última linha
 coluna = chr(a + col)
 formula = '=SUM(%s2:%s6)' % (coluna, coluna)
 sheet.getCellByPosition(col, lin + 6).setFormula(formula)
98 Disponível em: http://www.broffice.org/.
BrOffice.org 313
 for lin in xrange(1, 6):
 # Numera as linhas
 sheet.getCellByPosition(0, lin).setValue(lin)
 # Coloca somatórios no fim de cada linha
 formula = '=SUM(B%d:D%d)' % (lin + 1, lin + 1)
 sheet.getCellByPosition(4, lin).setFormula(formula)
 
 # Preenche os dados
 for col in (1, 2, 3):
 sheet.getCellByPosition(col, lin).setFormula('=10*RAND()')
 # Substitui a fórmula pelo valor
 val = sheet.getCellByPosition(col, lin).getValue()
 sheet.getCellByPosition(col, lin).setValue(val)
 return None
Saída:
Para que o BrOffice.org possa identificar o script escrito em Python como um 
arquivo de macro, ele precisa estar na pasta para scripts em Python, que no 
Windows fica em “Basis\share\Scripts\python”, dentro da pasta de 
instalação do BrOffice.org.
314 BrOffice.org
Exemplo de geração de relatório em PDF através do editor de texto (Writer), 
através da Python UNO Bridge:
# -*- coding: latin1 -*-
# Para iniciar o BrOffice.org como servidor:
# swriter.exe -headless
# "-accept=pipe,name=py;urp;StarOffice.ServiceManager"
import os
import uno
from com.sun.star.beans import PropertyValue
# Dados...
mus = [('Artista', 'Faixa'),
 ('King Crimson', 'Starless'), ('Yes', 'Siberian Khatru'),
 ('Led Zeppellin', 'No Quarter'), ('Genesis', 'Supper\'s Ready')]
# Obtêm o número e o tamanho dos registros
rows = len(mus)
cols = len(mus[0])
# Inicio do "Boiler Plate"...
# Contexto de componente local
loc = uno.getComponentContext()
# Para resolver URLs
res = loc.ServiceManager.createInstanceWithContext(
 'com.sun.star.bridge.UnoUrlResolver', loc)
# Contexto para a URL
con = res.resolve('uno:pipe,name=py;urp;StarOffice.ComponentContext')
# Documento corrente
desktop = con.ServiceManager.createInstanceWithContext(
 'com.sun.star.frame.Desktop', con)
# Fim do "Boiler Plate"...
# Cria um documento novo no Writer
doc = desktop.loadComponentFromURL('private:factory/swriter',
 '_blank', 0, ())
# Cursor de texto
BrOffice.org 315
cursor = doc.Text.createTextCursor()
# Muda as propriedades do texto
cursor.setPropertyValue('CharFontName', 'Verdana')
cursor.setPropertyValue('CharHeight', 20)
cursor.setPropertyValue('CharWeight', 180)
# Insere o texto no documento
doc.Text.insertString(cursor, 'Músicas favoritas\n', 0)
# Cria tabela
tab = doc.createInstance('com.sun.star.text.TextTable')
tab.initialize(rows, cols)
doc.Text.insertTextContent(cursor, tab, 0)
# Preenche a tabela
for row in xrange(rows):
 for col in xrange(cols):
 cel = chr(ord('A') + col) + str(row + 1)
 tab.getCellByName(cel).setString(mus[row][col])
# Propriedades para exportar o documento
props = []
p = PropertyValue()
p.Name = 'Overwrite'
p.Value = True # Sobrescreve o documento anterior
props.append(p)
p = PropertyValue()
p.Name = 'FilterName'
p.Value = 'writer_pdf_Export' # Writer para PDF
props.append(p)
# URL de destino, no qual o arquivo PDF será salvo
url = uno.systemPathToFileUrl(os.path.abspath('musicas.pdf'))
# Salva o documento como PDF
doc.storeToURL(url, tuple(props))
# Fecha o documento
doc.close(True)
Saída (arquivo PDF):
316 BrOffice.org
A API do BrOffice.org é bastante completa e simplifica várias atividades que 
são lugar comum em programas para ambiente desktop.
Integração com outras linguagens 317
Integração com outras linguagens
Existe hoje muito código legado desenvolvido em diversas linguagens que 
pode ser aproveitado pelo Python, através de várias formas de integração.
Uma forma genérica de fazer isso é gerar uma biblioteca compartilhada 
(shared library) através do compilador da outra linguagem e fazer chamadas a 
funções que estão definidas na biblioteca.
Como a implementação original do Python é usando Linguagem C, é possível 
integrar Python e C nos dois sentidos:
▪ Python -> C (Python faz chamadas a um módulo compilado em C).
▪ C -> Python (C evoca o interpretador Python em modo embedded).
Também é possível integrar o Python com Fortran usando o utilitário f2py, 
que faz parte do projeto NumPy.
Bibliotecas compartilhadas
A partir da versão 2.5, o Python incorporou o módulo ctypes, que implementa 
tipos