0

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

1 回答 1

3

当你import第二个模块时,你没有做这if __name__ == "__main__":部分。(这就是这个习惯用法的全部意义——提供在您是顶级脚本时运行的代码,而不是在您被import编辑时运行的代码。)因此,您永远不会创建 Tk 应用程序和主事件循环,这意味着没有 Tk 代码可以做任何事情,并且您的 GUI 永远不会显示出来。

但是在你尝试通过将代码移动到一个函数中并调用它来解决这个问题之前,你不能只tkinter从一个函数中调用主事件循环pygame,因为这样pygame循环将被阻塞,直到tkinter应用程序退出。

我认为您在这里的困惑是您将模块、脚本和进程以及一堆其他东西混合在一起,并将它们都称为“程序”。有关差异的入门知识,请参见下文。

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

  • pygame只要您正确连接,就可以使用您想要的任何事件循环。这意味着您可以创建一个顶级tkinter应用程序并在其下运行pygame代码。
  • 您可以保留现有pygame循环,并tkinter在另一个线程中运行循环。
  • 改为在其中一个GUI 工具包中重新编码你的tkinter东西。pygame
  • 如果您真的想将每个模块视为“运行程序”,正如您在描述中所说的那样,请实际这样做:使用subprocess以启动sys.executable另一个脚本作为其第一个参数。

相同的 Python 文件highscore.py可以作为脚本运行,也可以作为模块导入。这些在某些方面是相似的,在其他方面是不同的。

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

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

于 2013-03-05T20:08:50.570 回答