我正在处理一个python项目,其中我有一个pygame窗口,但我也希望在它旁边有一个PyGTK窗口,同时提供有关pygame窗口中对象的信息。然而,当我启动PyGTK窗口时,游戏窗口就会冻结,直到关闭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发布于 2015-12-15 17:00:57
我查看了OnGle在他的答案中提到的堆栈溢出问题,并看到了两个我觉得可以实现的解决方案。
解决方案1
https://stackoverflow.com/a/199288/4468084 I可以将程序的PyGTK部分完全保存在一个单独的进程中,只需在两个当前运行的程序之间发送数据。然而,这似乎有点过头了,我需要。
解决方案2
我可以使用PGU或OcempGUI,这两个库都是用来简化低级图形编程的。使用其中之一,我可以完全忘记使用PyGTK,而只使用来自它们的预先制作的对象。
摘要
虽然解决方案1将我最初的PyGTK实现牢记在心,但对于我正在制作的这样一个简单的程序来说,它可能也太复杂了。最重要的是,使用解决方案1还意味着在运行我的程序时必须同时打开两个窗口,使程序显得杂乱无章、笨重不堪。
另一方面,解决方案2干净地将对象列表集成到我的Pygame项目中,同时也减少了我必须编写的代码数量。我也不必担心不同的操作系统以不同的方式处理数据传输,这可能是解决方案1的一个问题。最后,这似乎是我的更好的决定。
发布于 2015-12-15 02:36:02
我对gtk或python中的线程还不太了解,无法真正帮助您,但也许您可以将其用作pyGame在pyGTK应用程序中的一项工作。
https://stackoverflow.com/questions/34236469
复制相似问题