基本上我已经为我的游戏创建了一个pygame菜单,当我点击它们时,它将加载所有其他pygame窗口,但是对于某些方面,如添加用户等,
我是在Tkinter GUI中创建的。当我点击加载它们在我的pygame它不会加载Tkinter GUI,有人知道我怎么能解决这个问题,或者如果有我需要添加的东西,使其工作。
它表现得好像要加载什么东西,但没有,第一个叫做"mathsvaders"加载得很好,因为它是一个pygame程序,但高分是在tkinter中,没有加载:
...
pos = 1
while True:
#events
for e in pygame.event.get():
if e.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif e.type == pygame.KEYDOWN:
if e.key == pygame.K_DOWN:
pos += 1
if pos > 5:
pos = 1
elif e.key == pygame.K_UP:
pos -= 1
if pos < 1:
pos = 5
elif e.key == pygame.K_RETURN:
if pos == 1:
import MathsvadersReal
elif e.key == pygame.K_RETURN:
if pos == 2:
import Highscore
elif pos == 5:
pygame.quit()
sys.exit()
表单的代码如下:
import Tkinter import Databaseconnector
class simpleapp_tk(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.initialize()
def initialize(self):
def create_widgets(self):
# create welcome label
label1 = Tkinter.Label(self, text = "Hello world")
label1.grid(row = 0, column = 2, columnspan = 4, sticky = 'E')
if __name__ == "__main__":
app = simpleapp_tk(None)
app.title('my application')
app.geometry("250x200")
app.mainloop()
当您import
第二个模块时,您没有做if __name__ == "__main__":
部分。(这是习语的全部要点-提供运行的代码,当你是顶级脚本,但不是当你是import
编辑。)所以,你从来没有创建Tk应用程序和主事件循环,这意味着没有Tk代码可以做任何事情,你的GUI永远不会显示。
但是在你试图通过将代码移动到函数中并调用它来修复这个问题之前,你不能只是从pygame
调用tkinter
主事件循环,因为这样pygame
循环将被阻塞,直到tkinter
应用程序退出。
我认为你在这里的困惑是,你把模块、脚本、过程和一堆其他的东西混在一起,称它们为"程序"。
如果你真的想这样做,有几种可能性:
-
pygame
可以使用任何你想要的事件循环,只要你把事情正确地连接起来。这意味着你可以创建一个顶级tkinter
应用程序,并在其下运行pygame
代码。 - 你可以保留你现有的
pygame
循环,并在另一个线程中运行tkinter
循环。 - 在
pygame
GUI工具包中重新编码tkinter
的内容。 - 如果你真的想把每个模块当作"运行一个程序",正如你在描述中所说的,实际上这样做:使用
subprocess
来启动sys.executable
,并将另一个脚本作为其第一个参数。
像highscore.py
这样的Python文件可以作为脚本运行,也可以作为模块导入。它们在某些方面相似,在另一些方面又不同。
你运行它作为一个脚本,例如,在你的DOS/bash/任何shell中输入python highscore.py
(或在另一个程序中使用subprocess.Popen(sys.executable, 'highscore.py')
之类的东西)。这将启动一个新进程,运行Python解释器,执行highscore.py
中的代码,然后退出。这不会影响任何其他进程,因为您的操作系统知道如何同时运行不同的进程。执行highscore.py
代码时,__name__
被设置为"__main__"
。
通过在运行的Python程序中执行import highscore
,将其作为模块导入。并不会启动一个新进程,它只是在现有Python程序的中间执行highscore.py
中的代码,然后继续执行下一行。执行highscore.py
代码时,__name__
设置为"highscore"
。
无论哪种方式,所有顶层模块代码都将被执行,包括定义类和函数,以及您编写的任何其他语句。您可以使用if __name__ == "__main__":
检查,以便在文件作为脚本运行时执行额外的代码,而不是在文件作为模块导入时执行。
也有值得指出的地方。在你的代码中有:
elif e.key == pygame.K_RETURN:
if pos == 1:
import MathsvadersReal
elif e.key == pygame.K_RETURN:
if pos == 2:
import Highscore
elif pos == 5:
pygame.quit()
sys.exit()
如果这是你真正的缩进,elif e.key == pygame.K_RETURN
将永远是True,所以它是不必要的,并且你无法到达elif pos == 5:
,所以没有办法退出