2008-08-25 57 views
8

在PyGTK应用程序中使用PyGame(SDL)的最佳方式是什么?pyGTK应用程序中的pyGame

我正在寻找一种方法,该方法允许我在GTK窗口中具有绘图区域,并且同时能够管理GTK和SDL事件。

回答

7

我从来没有尝试过自己,但听过很多关于其他尝试过的人,这不是你想要走的路。

还有一种将gui放入pygame中的方法。有很多专门为pygame构建的gui工具包,您可以使用。他们大多数都还没有完成,但有两个大的,积极维护的:PGUOcempGUI。 pygame网站上的完整列表是here

1

PyGame可以更好地管理自己的窗口,甚至更好地使用整个屏幕。 GTK具有足够灵活的小部件以允许创建绘图区域。

This page虽然,如果你想尝试它可能会有所帮助。

0

前段时间我尝试过这样做,但我从来没有完全理解它。实际上我从来没有在Windows下工作,因为它一直在崩溃整个操作系统,我跑出了耐心。我继续使用它,因为它只在Linux上运行很重要,并且只是一个小项目。我强烈建议你调查替代品。它总是感觉像一个讨厌的黑客,让我感到肮脏。

0

有一个简单的解决方案可能适合你。

将PyGTK的东西和PyGame的东西写成单独的应用程序。然后从PyGTK应用程序调用PyGame应用程序,使用os.system调用PyGame应用程序。如果您需要在两者之间共享数据,则可以使用数据库,管道或IPC。

1

http://faq.pygtk.org/index.py?file=faq23.042.htp&req=show提到这一切:

你需要创建一个绘图区域,并设置环境变量SDL_WINDOWID它实现后:

 
import os 

import gobject 
import gtk 
import pygame 

WINX = 400 
WINY = 200 

window = gtk.Window() 
window.connect('delete-event', gtk.main_quit) 
window.set_resizable(False) 
area = gtk.DrawingArea() 
area.set_app_paintable(True) 
area.set_size_request(WINX, WINY) 
window.add(area) 
area.realize() 

# Force SDL to write on our drawing area 
os.putenv('SDL_WINDOWID', str(area.window.xid)) 

# We need to flush the XLib event loop otherwise we can't 
# access the XWindow which set_mode() requires 
gtk.gdk.flush() 

pygame.init() 
pygame.display.set_mode((WINX, WINY), 0, 0) 
screen = pygame.display.get_surface() 

image_surface = pygame.image.load('foo.png') 
screen.blit(image_surface, (0, 0)) 

gobject.idle_add(pygame.display.update) 

window.show_all() 

while gtk.event_pending(): 
    # pygame/SDL event processing goes here 
    gtk.main_iteration(False) 
0

糖业项目与PyGTK的和pygame的建几个活动。

他们写了一个支持库来实现这个,叫Sugargame。你应该可以修改它而不是Sugar的PyGTK应用程序。

这是关于如何使用它的chapter in Sugar's development book

该库允许在GTK和PyGame之间进行通信事件。

享受!