Pygame和PyGTK并排

时间:2015-12-12 05:01:57

标签: python pygame pygtk

我正在开发一个python项目,我有一个pygame窗口,但我也想在它旁边有一个PyGTK窗口,同时提供有关pygame窗口内对象的信息。但是,当我启动PyGTK窗口时,pygame窗口会冻结,直到PyGTK窗口关闭,即使我在一个线程中执行了所有PyGTK内容。

enter image description here 我项目中的重要代码:

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

2 个答案:

答案 0 :(得分:3)

我对python中的gtk或线程知之甚少并不是很有帮助,但也许你可以将它用作pyGame within a pyGTK application

的解决方法

答案 1 :(得分:2)

我查看了他的回答中提到的堆栈溢出问题OnGle,并看到了两种解决方案,我觉得我能够实现。

解决方案1 ​​

https://stackoverflow.com/a/199288/4468084 我可以将程序的PyGTK部分保存在一个单独的进程中,只需在当前运行的两个程序之间发送数据。但是,对于我需要的东西,这似乎有点过分了。

解决方案2

我可以使用PGUOcempGUI,它们都是Pygame库,旨在简化低级图形编程。使用其中一个,我可以忘记完全使用PyGTK并只使用它们的预制对象。

摘要

虽然解决方案1仍然考虑到我原来的PyGTK实现,但对于我正在制作的这样一个简单程序来说,它也可能过于复杂。最重要的是,使用解决方案1也意味着我必须在我的程序运行时继续打开两个窗口,使其看起来混乱和笨重。

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