ldev

Janeiro 7, 2008

criando um .exe com Python + GTK

Arquivado em: programação — Tags:, , , — Lucas Nogueira @ 4:07 am

Quando eu faço minhas App usando PyGTK não é problema empacotar a aplicação no Linux, mas no Windows era, até eu conhecer o py2exe.

Ele funciona assim: você cria um script em .py com as instruções de empacotamento. O Py2exe compila seus scripts, pega alguns .dll e bota numa pasta chamada dist ( você deve empacotar TUDO que estiver dentro dessa pasta ) Para criar um .exe de um script de console, clique aqui, caso contrário, crie um arquivo .py e cole esse modelo nele:

Aconselho você a botar o código fonte numa pasta separada ( src ) do script ..

# -*- coding: utf-8 -*-
## setup_win32.py (run me as python setup_win32.py py2exe -O2)
##
## Copyright (C) 2003-2006 Yann Le Boulanger
## Copyright (C) 2005-2006 Nikos Kouremenos
## Copyright (C) 2007 Marcelo Lira dos Santos
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published
## by the Free Software Foundation; version 2 only.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##

from distutils.core import setup
import py2exe
import glob
import sys

sys.path.append('src') # o código fonte ta aqui 

includes = ['encodings', 'encodings.utf-8',]
opts = {
    'py2exe': {
        'includes': 'pango,atk,gobject,cairo,pangocairo,gtk.keysyms,encodings,encodings.*',
        'dll_excludes': [
            'iconv.dll','intl.dll','libatk-1.0-0.dll',
            'libgdk_pixbuf-2.0-0.dll','libgdk-win32-2.0-0.dll',
            'libglib-2.0-0.dll','libgmodule-2.0-0.dll',
            'libgobject-2.0-0.dll','libgthread-2.0-0.dll',
            'libgtk-win32-2.0-0.dll','libpango-1.0-0.dll',
            'libpangowin32-1.0-0.dll','libcairo-2.dll',
            'libpangocairo-1.0-0.dll','libpangoft2-1.0-0.dll',
        ],
    }
}

setup(
    name = 'Aplicacao',
    version = '1.0',
    description = 'Uma aplicação qualquer',
    author = 'Vc',
    url = '',
    download_url = '',
    license = 'GPL',

    windows = [{'script': 'src/aplicacao.pyw', #aqui fica o script principal
                'icon_resources': [(1, 'glade/icone.ico')]}], #aqui fica o icone do programa
    options=opts,

    data_files=[('glade', glob.glob('glade/*.*')), # pastas e arquivos que acompanham o programa
                ('data', glob.glob('data/*.*')),
    ],
)

Esse script é apenas um modelo. Edite conforme as suas necessidades.A parte da compilação é um pouco nojenta … Abra o console do Windows ( Iniciar > Executar > cmd ), vá até a pasta aonde o script tá e lasque no terminal:

python setup_win32.py py2exe -O2

Logo após, se não houver nenhum erro, as pastas dist e build serão criadas e pronto !

MAS ATENÇÃO, para o programa funcionar em outros computadores , o GTK deverá estar instalado!!! Se você quiser embutir o GTK, siga esse tuto

fonte

Janeiro 5, 2008

Code contest – mega sena

Arquivado em: internet, programação — Tags: — Lucas Nogueira @ 8:31 am

No blog do Bernado Rufino vi um code contest que ele viu no Macaco Chefe e me interessei xD

Mesmo sendo meio antiguinha ( 25/08/07 ) eu resolvi o seguinte problema em python:

Escrever em qualquer linguagem de programação um programa que realize 100.000 sorteios de um numero entre 1 e 60 e mostre na tela os 6 mais freqüentes.

Aqui vai minha solução:

from random import randint
l , ct = [] , {}
while len(l) <= 100000: l += [ randint(1,60) ]
for x in l: ct[x] = l.count(x)
count = ct.values()
count.sort()
for n in ct.keys():
    if ct[n] == count[len(count)-1] or ct[n] == count[len(count)-2] or ct[n] == count[len(count)-3] or ct[n] == count[len(count)-4] or ct[n] == count[len(count)-5] or ct[n] == count[len(count)-6]  : print n

8 linhas :(

PIL – Python Imaging Library

Arquivado em: programação — Tags:, — Lucas Nogueira @ 7:20 am

Estou iniciando um estudo sobre o Python Imaging Library e quero fazer uns resumos do que vou aprendendo. Os códigos vão falar por si, então não vou comentar muito …

instalação do PIL:

Windows: pacote .exe ( para python 2.5 )

Debian-based:
sudo apt-get install python-imaging


abrindo uma imagem

import Image
img = Image.open(" ball.png")

Os seguintes atributos podem ser muito úteis nos seus programas:

img.format
img.size
img.mode

lendo e salvando uma imagem

O PIL suporta vários formatos de imagem. Para salvar uma imagem use o método save(filepath , FT=filetype)

import Image

img = Image.open(" ball.png ")
img.save( "ball-convertida.jpeg" , "JPEG")  # o segundo argumento é opcional ..

criando miniaturas

import Image

tsize = 100,100

img = Image.open(" ball.png ")
img.thumbnail ( tsize , image.ANTIALIAS ) #o image.ANTIALIAS é opcional ...
img.save( "ball_mini.png" )

recortando e colando imagensusando o método crop( a , b , c , d ) você pode criar um subretângulo de uma imagem. OBS: a,b são as coordenadas do ponto superior-esquerdo e c,d as coordenadas do ponto inferior-direito. A área do local aonde o retângulo será colado deve ser do mesmo tamanho do retângulo

import Image

img = Image.open("abc.PNG")

rcoord = 25,25 , 100,100

rect = img.crop( rcoord )
rect.transpose( Image.ROTATE_90 ) # faz o pedaco girar 90 graus

img.paste( rect , rcoord )
img.save("abc.PNG")

transformações geométricas

import Image

img = Image.open("ball.PNG")

out = img.resize( (200,200) ) #blah
out = out.rotate( -45 ) # a  clockwise ; a > 0 -> anticlockwise
out = out.transpose( Image.ROTATE_90 ) # mesma cois que rotate()
out.save("balll.PNG")

OBS: no métdo transpose() também pode ser usado os atributos:

Image.FLIP_LEFT_RIGHT

Image.FLIP_TOP_BOTTOM

filtros

import ImageFilter
out = img.filter( ImageFilter.DETAIL )

operações com pixelscom o método point() você pode brincar com os valores do pixel. Usando uma função lambda pode-se aplicar algo em todos os pixels

out = img.point(lambda i: i * 1.2) # multiplicando todos os pixels por 1.2

você pode aplicar esses efeitos individualmente

import Image

rcord = 10,10,300,300

img = Image.open("abc.PNG")
rect = img.crop(rcord)
rect = rect.point(lambda i: i*2)
img.paste(rect , rcord)
img.save("abc-n.PNG")

escrevendo nas imagens


import Image
import ImageDraw # modulo de primitivas e textos

img = Image.open("abc.PNG")
dr = ImageDraw.Draw(img)
pos = 0,0
dr.text( pos , "http://ldev.wordpress.com")
img.save("abc-n.PNG")

escrevendo nas imagens usando o ImageFont

import ImageFont

ft = ImageFont.truetype("tahoma.ttf",15)
dr.text( pos , "http://ldev.wordpress.com" , font=ft )

Em breve postarei mais sobre o PIL ! :D fontes: PIL handbook , eu podia ta matando

Outubro 15, 2007

princípios de sockets em python

Arquivado em: programação — Tags:, — Lucas Nogueira @ 7:38 pm

o que é um socket ? Socket é o caminho mais simples de comunicação entre dois aplicativos localizados em máquinas diferentes. As conexões que você abriu com o nosso servidor pra estar lendo esse texto são sockets.

Existem alguns tipos de sockets como: Stream sockets , Datagram sockets e raw sockets. Abordarei somente Stream sockets e Datagram socket, mas qual a diferença de Stream sockets do Datagram socket ?

Em Stream sockets, é uma conexão constante entre servidor e cliente que se mantêm viva até ser fechada, e ambas as partes tem conhecimento sabem se a conexão está viva. Nos Datagram socket não é assim… A conexão não é constante e você não sabe se seus dados foram enviados.

Agora vamos botar a mão na massa :D !

Stream Sockets

Abra um console Python e digite:

>>> import socket

>>> s = socket.socket( socket.AF_INET , socket.SOCK_STREAM)

Neste trecho você importou o módulo socket e criou um Stream socket. Antes de continuarmos, vamos fazer um servidor!

import socketmySocket = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )

mySocket.bind ( ( '', 2727 ) )

mySocket.listen ( 1 )

while True:

	channel, details = mySocket.accept()

	print 'nos conectamos a ', details

	print channel.recv ( 100 )

	channel.send ( 'fala que te escuto ...' )

	channel.close()

Salve este programa como server.py . As linhas 1 e 2 já são conhecidas, não é ? Na linha 3 nós abrimos a porta 2727 para conexões . Na linha seguinte dizemos ao servidor para esperar ou escutar por clientes. Após isto temos um looping infinito . Neste looping nós aceitamos a conexão, imprimos o endereço do cliente, respondemos o cliente, e finalmente fechamos a conexão.

Agora voltando ao cliente , vamos nos conectar ao servidor (antes de botar esses códigos no interpretador, inicie o servidor ( server.py ):

>>> import socket

>>> s = socket.socket( socket.AF_INET , socket.SOCK_STREAM )
Como você sabe muito bem, criamos o socket…

>>> s.conect( ( ‘localhost’ , 2727) )
whooa! nos conectamos no servidor! Cheque a shell do servidor ;)

>>> s.send( ‘ is anybody out there ?’)
enviamos a nossa mensagem ao servidor. Agora vamos receber a resposta:

>>> s.recv(100)
Com isto deve aparecer a resposta :) Agora vamos desligar o socket:

>>> s.close()

Datagram Sockets

Abra o server.py e deixe-o assim:

import socket

mySocket = socket.socket ( socket.AF_INET, socket.SOCK_DGRAM )

mySocket.bind ( ( '', 2727 ) )

while True:

   data, client = mySocket.recvfrom ( 100 )

   print 'recebemos um datagrama de: ', client

   print data

   mySocket.sendto ( 'fala que te escuto ....', client )

as diferenças são poucas, mas muito importantes… Preste atenção no socket.SOCK_DGRAM !

E agora o cliente:

>>> import socket
>>> mySocket = socket.socket ( socket.AF_INET, socket.SOCK_DGRAM )
>>> mySocket.sendto ( ‘Wherefore art thou?’, ( ‘localhost’, 2727 ) )
>>> data, server = mySocket.recvfrom ( 100 )
>>> print data

fonte

Outubro 12, 2007

herança em python

Arquivado em: programação — Tags: — Lucas Nogueira @ 1:54 pm

 

Temos a classe Pai, com 2 atributos: a e b, nela temos o construtor __init__.

Também temos a classe Filho, que herda as coisas de Pai, nela tem o atributo c , e seu construtor.

 

mas, como passar argumentos para a superclasse ? Eis a solução:

 

class Pai:
	def __init__(self, a, b):
		self.a = a
		self.b = b

class Filho(Pai):
	def __init__(self,c):
		self.c = c

new = Filho(5)

new.a = new.c
new.b = new.a

print new.b

Também contamos com a função super() (não é a mesma coisa do Java :P )

class Pai:
	def __init__(self , a , b):
		self.a = a*2
		self.b = b*2

class Filho(Pai):
	def __init__(self, c):
		v = super(Filho , Pai).create(c , c) # Instancia Pai com os argumentos recebidos da classe Filho.
		self.a = v.a # ta-da ;D
		self.b = v.b

filho = Pai(2)

print filho.a
print filho.b

Outubro 10, 2007

pygame.init()

Arquivado em: programação — Tags:, — Lucas Nogueira @ 6:46 pm

Após uma solitude nerd-computacional, voltei mexendo no PyGame. Fiz um programinha que era pra desenhar o gráfico da função tangencial, ele desenhou uma cosisa bem legal. Não sei se isso é o gráfico correto, mas ficou bem legal :)

óia o screenshot:

Quer o source ? Here you go!

movimentos_pygame.tar.gz

Seguinte, você tem que ter o PyGame instalado no seu PC ( sudo apt-get install python-pygame ) ;)

Blog no WordPress.com.