pygtk + pygame

Maio 17, 2008

Há algum tempo venho estudando pygtk e pygame, e recentemente tive a idéia de migrar um jogo, feito por um colega, de C++ para pygame. Como o jogo original possui uma interface gráfica bonitinha, então pensei “tenho que fazer o mesmo com o python, mas como?” Pois até então nunca tinha trabalhado com pygtk e pygame juntos. Resolvi vasculhar na net algo sobre e encontrei uma solução ótima e simples (alias como tudo em python). A solução é criar um gtk.DrawingArea e dentro dele mapear uma superfície SDL, no nosso caso a tela do pygame (pygame.display()). Uma vez que você fez isso é só manipular o seu código pygame no seu display e pronto. Agora eu vou deixar de enrolar e mostrar e explicar o tal código.

CODE

# Proof of concept for PyGTK+Pygame
# Seo Sanghyeon

import os, pygame, gtk, pygtk
import random
def pygame_hack(widget):

def callback(widget, *args):

handle = widget.window.xid
size = widget.size_request()
os.environ['SDL_WINDOWID'] = str(handle)
pygame.display.init()
pygame.display.set_mode(size)

widget.connect(’map-event’, callback)

def fill_random(widget):

screen = pygame.display.get_surface()
r = random.randrange(255)
g = random.randrange(255)
b = random.randrange(255)
screen.fill((r, g, b))
pygame.display.flip()

def main():

win = gtk.Window()
win.connect(’destroy’,gtk.main_quit)
box = gtk.VBox()
win.add(box)
custom = gtk.DrawingArea()
custom.set_size_request(300,200)
pygame_hack(custom)

box.pack_start(custom)
button = gtk.Button(Random fill)

button.connect(clicked‘,fill_random)

box.pack_start(button)

win.show_all()
gtk.main()

if __name__ == __main__:

main()

De todo o código a parte mais importante é a função pygame_hack. É nessa parte do código que pegamos o ID da nossa DrawingArea e copiamos para ser o ID da nossa SDLWINDOW, e é isso que faz com que o display do pygame rode dentro dela.

Neste código abaixo pegamos o XID, ou código do X da nossa janela.

handle = widget.window.xid

Neste outro copiamos o XID da nossa DrawingArea pra dentdo da nossa SDLWINDOW.

os.environ['SDL_WINDOWID'] = str(handle)

Essa pequena applicação mostra uma janela pygtk com um botão que quando acionado preenche o display do pygame dentro do DrawingArea com uma cor que foi selecionada randomicamente. Ver imagem abaixo.

Viu tudo muito simples. Só tem um problema não roda no windows pois ele não consegue pegar o XID, ainda estou procurando um jeito de fazer isso no ruindows, mas no linux roda normal, então tá otimo. O legal desse exemplo é que ele mostra e dá ideias, além de você poder por um display do pygame, você pode por um display do opengl e fazer uma aplicação bem interessante. Afinal com python nem o céu é o limite =].

Como o intuito deste artigo é apenas explicar como por o pygame dentro da janela do gtk não vou explicar todo o código linha a linha, mas se alguém tiver alguma duvida sobre comenta ai que eu respondo.


Entry Filed under: Python, pygame, pygtk. .

Leave a Comment

Required

Required, hidden

Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Trackback this post  |  Subscribe to the comments via RSS Feed


Arquivos

Categorias

 

Maio 2008
S T Q Q S S D
    Jun »
 1234
567891011
12131415161718
19202122232425
262728293031  

Links

del.icio.us/kirotawa

Autores