在 PyGTK 应用程序中使用 PyGame (SDL) 的最佳方式是什么?
我正在寻找一种方法,它允许我在 GTK 窗口中拥有一个绘图区域,同时能够管理 GTK 和 SDL 事件。
当 PyGame 可以管理自己的窗口时,它会更好地工作,甚至更好的是,使用整个屏幕。GTK 具有足够灵活的小部件以允许创建绘图区域。
但是,如果您想尝试,此页面可能会有所帮助。
您可能对此消息线程感兴趣。看起来他们建议反对它。
http://faq.pygtk.org/index.py?file=faq23.042.htp&req=show提到了这一切:
实现后需要创建绘图区并设置环境变量SDL_WINDOWID:
导入操作系统 导入对象 导入gtk 导入pygame WINX = 400 WINY = 200 窗口 = gtk.Window() window.connect('删除事件', gtk.main_quit) window.set_resizable(False) 面积 = gtk.DrawingArea() area.set_app_paintable(真) area.set_size_request(WINX,WINY) window.add(区域) area.realize() # 强制 SDL 写入我们的绘图区域 os.putenv('SDL_WINDOWID', str(area.window.xid)) # 我们需要刷新 XLib 事件循环,否则我们不能 # 访问 set_mode() 需要的 XWindow gtk.gdk.flush() pygame.init() pygame.display.set_mode((WINX, WINY), 0, 0) 屏幕 = 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() 而 gtk.event_pending(): # pygame/SDL 事件处理在这里 gtk.main_iteration(假)
有一个简单的解决方案可能对您有用。
将 PyGTK 的东西和 PyGame 的东西写成单独的应用程序。然后从 PyGTK 应用程序调用 PyGame 应用程序,使用 os.system 调用 PyGame 应用程序。如果您需要在两者之间共享数据,请使用数据库、管道或 IPC。
不久前我自己尝试过这样做,但我从来没有让它完美地工作。实际上,我根本没有让它在 Windows 下工作,因为它一直在使整个操作系统崩溃,我已经没有耐心了。我继续使用它,因为它只在 Linux 上运行很重要,而且只是一个小项目。我强烈建议您研究替代方案。它总是感觉像是一个讨厌的黑客,让我觉得很脏。
Sugar 项目有几个使用 PyGTK 和 PyGame 构建的活动。
他们编写了一个支持库来实现这一点,称为Sugargame。您应该能够为常规 PyGTK 应用程序而不是 Sugar 修改它。
这是Sugar 开发书中关于如何使用它的一章。
该库允许在 GTK 和 PyGame 之间进行事件通信。
享受!