我正在开发一个python项目,我有一个pygame窗口,但我也想在它旁边有一个PyGTK窗口,同时提供有关pygame窗口内对象的信息。但是,当我启动PyGTK窗口时,pygame窗口会冻结,直到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
答案 0 :(得分:3)
我对python中的gtk或线程知之甚少并不是很有帮助,但也许你可以将它用作pyGame within a pyGTK application
的解决方法答案 1 :(得分:2)
我查看了他的回答中提到的堆栈溢出问题OnGle,并看到了两种解决方案,我觉得我能够实现。
https://stackoverflow.com/a/199288/4468084 我可以将程序的PyGTK部分保存在一个单独的进程中,只需在当前运行的两个程序之间发送数据。但是,对于我需要的东西,这似乎有点过分了。
我可以使用PGU或OcempGUI,它们都是Pygame库,旨在简化低级图形编程。使用其中一个,我可以忘记完全使用PyGTK并只使用它们的预制对象。
虽然解决方案1仍然考虑到我原来的PyGTK实现,但对于我正在制作的这样一个简单程序来说,它也可能过于复杂。最重要的是,使用解决方案1也意味着我必须在我的程序运行时继续打开两个窗口,使其看起来混乱和笨重。
另一方面,解决方案2将对象列表干净地集成到我的Pygame项目中,同时还减少了我必须编写的代码量。我也不必担心不同的操作系统处理数据传输的方式不同,这可能是解决方案1的问题。最后,这似乎是我的情况更好的决定。