pyGTK应用程序中的pyGame
时间:2020-03-05 18:42:43 来源:igfitidea点击:
在PyGTK应用程序中使用PyGame(SDL)的最佳方法是什么?
我正在寻找一种方法,该方法允许我在GTK窗口中有一个绘图区域,并且同时能够管理GTK和SDL事件。
解决方案
回答
我们可能对此消息线程感兴趣。看来他们建议不要这样做。
回答
我自己从未尝试过,但是听到很多其他尝试过的人的消息,这不是我们想走的路。
可以将gui放在pygame本身中。有很多专门为pygame构建的gui工具包,可以使用。它们中的大多数还没有完成,但是有两个积极维护的大文件:PGU和OcempGUI。 pygame网站上的完整列表在这里。
回答
当PyGame可以管理自己的窗口时,甚至可以更好地使用整个屏幕,它的工作效果会更好。 GTK具有足够灵活的小部件以允许创建绘图区域。
但是,如果我们想尝试该页面,则可能会有所帮助。
回答
我曾尝试过自己做过一段时间,但我从未使其完美运行。实际上,我从来没有在Windows下完全使用过它,因为它一直使整个OS崩溃,并且我没有耐心。我继续使用它,因为它在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)