pyGTK应用程序中的pyGame
问题描述:
在PyGTK应用程序中使用PyGame(SDL)的最佳方式是什么?pyGTK应用程序中的pyGame
我正在寻找一种方法,该方法允许我在GTK窗口中具有绘图区域,并且同时能够管理GTK和SDL事件。
答
前段时间我尝试过这样做,但我从来没有完全理解它。实际上我从来没有在Windows下工作,因为它一直在崩溃整个操作系统,我跑出了耐心。我继续使用它,因为它只在Linux上运行很重要,并且只是一个小项目。我强烈建议你调查替代品。它总是感觉像一个讨厌的黑客,让我感到肮脏。
答
有一个简单的解决方案可能适合你。
将PyGTK的东西和PyGame的东西写成单独的应用程序。然后从PyGTK应用程序调用PyGame应用程序,使用os.system调用PyGame应用程序。如果您需要在两者之间共享数据,则可以使用数据库,管道或IPC。
答
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)
答
糖业项目与PyGTK的和pygame的建几个活动。
他们写了一个支持库来实现这个,叫Sugargame。你应该可以修改它而不是Sugar的PyGTK应用程序。
这是关于如何使用它的chapter in Sugar's development book。
该库允许在GTK和PyGame之间进行通信事件。
享受!