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)