Pygame GUI - 未加载

时间:2013-03-05 20:02:15

标签: python user-interface tkinter pygame

基本上我已经为我的游戏创建了一个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()    

1 个答案:

答案 0 :(得分:3)

当您import第二个模块时,您没有执行if __name__ == "__main__":部分。 (这就是那个成语的重点 - 提供在你是顶级脚本时运行的代码,但不是在import编辑时运行。)所以,你永远不会创建Tk应用程序和主事件循环,意思是没有Tk代码可以做任何事情,你的GUI永远不会显示。

但在尝试通过将代码移动到函数并调用它来解决此问题之前,您不能只从tkinter调用pygame主事件循环,因为那样{ {1}}循环将被阻止,直到pygame应用退出。

我认为你在这里的困惑是你混淆了模块,脚本和进程以及其他一些东西,并将它们称为“程序”。有关差异的介绍,请参见下文。

如果你真的想这样做,有几种可能性:

  • tkinter可以处理您想要的任何事件循环,只要您正确连接即可。这意味着您可以创建顶级pygame应用并在其下运行tkinter代码。
  • 您可以保留现有的pygame循环,并在另一个主题中运行pygame循环。
  • pygame GUI toolkits之一中重新编码tkinter内容。
  • 如果您确实希望将每个模块视为“正在运行程序”,正如您在说明中所说的那样,实际执行此操作:使用subprocess以其他脚本作为其第一个参数启动tkinter

sys.executable这样的Python文件可以作为脚本运行,也可以作为模块导入。这些在某些方面类似,在其他方面则不同。

您可以将其作为脚本运行,例如,在您的DOS / bash /任何shell中键入highscore.py(或在其他程序中使用python highscore.py之类的内容)。这将启动一个新进程,运行Python解释器,执行subprocess.Popen(sys.executable, 'highscore.py')中的代码,然后退出。这不会影响任何其他进程,因为您的操作系统知道如何同时运行单独的进程。在执行highscore.py代码时,highscore.py设置为__name__

通过在正在运行的Python程序中执行"__main__"将其作为模块导入。这启动一个新进程,它只是在现有Python程序的中间执行来自import highscore的代码,然后继续下一行。在执行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,所以没有办法退出。