Pygame 和 PyGTK 并排

Pygame and PyGTK side by side

我正在做一个 python 项目,我有一个 pygame window,但我也想在它旁边有一个 PyGTK window同时包含有关 pygame window 内对象的信息。但是,当我启动 PyGTK window 时,pygame window 会冻结,直到 PyGTK 关闭,即使我在一个线程中执行所有 PyGTK 操作也是如此。

我项目中的重要代码片段:

import thread
import pygtk
import gtk

class SelectList:
    def __init__(self, parent):
        self.parent = parent
        self.initWindow()
        self.main()

    def main(self):
        gtk.main()

    def initWindow(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

        self.window.connect("destroy", self.destroy)

        self.window.set_title("Selection info")
        self.window.set_position(gtk.WIN_POS_CENTER)

        # junk that I didn't bother including in this example
        # ...

        self.window.show_all()

    #This is only connected to the main window
    #When this is called it iterates through every toplevel window and closes it
    def destroy(self, widget, data=None):
        for i in gtk.window_list_toplevels():
            i.destroy()
        gtk.main_quit()


def openList(instance):
    SelectList(instance)

class Maker:
    def __init__(self):
        # more stuff that I won't include
        pass

    def logic(self, newkeys):
        if K_l in newkeys:
            thread.start_new_thread(openList, (self, ))

    def main(self):
        while True:
            # pygame stuff, including sending all new key presses to logic method
            pass

我对 python 中的 gtk 或线程的了解还不够,无法真正提供帮助,但也许您可以使用它来解决 pyGame within a pyGTK application

我查看了OnGle在他的回答中提到的堆栈溢出问题,看到了两个我觉得可以实现的解决方案。


解决方案 1

我可以将程序的 PyGTK 部分完全放在 单独的进程 中,并且只在两个当前 运行 程序之间发送数据。然而,这似乎有点过分了。

解决方案 2

我可以使用任何一个 PGU or OcempGUI,它们都是 Pygame 旨在简化低级图形编程内容的库。使用其中之一,我可以忘记完全使用 PyGTK,而只使用它们中的预制对象。


总结

虽然解决方案 1 保留了我最初的 PyGTK 实现,但对于我正在制作的如此简单的程序来说,它也可能过于复杂。最重要的是,使用解决方案 1 还意味着当我的程序是 运行 时,我必须继续同时打开两个 windows,使它看起来杂乱无章。

另一方面,解决方案 2 将对象列表干净地集成到我的 Pygame 项目中,同时还减少了我必须编写的代码量。我也不必担心不同的操作系统处理数据 t运行sfers 不同,因为解决方案 1 可能会出现问题。最后,这似乎是我的情况更好的决定。