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 可能会出现问题。最后,这似乎是我的情况更好的决定。
我正在做一个 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 可能会出现问题。最后,这似乎是我的情况更好的决定。