2013-03-05 140 views
0

基本上我为我的游戏创建了一个pygame菜单,当我点击它们时,它会加载所有其他pygame窗口,但是对于某些方面,如添加用户等等,
我在Tkinter GUI。当我点击将它们加载到我的pygame中时,它不会加载Tkinter GUI,有谁知道我可以如何解决这个问题,或者如果有什么我需要添加来使其工作。Pygame 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()  
+0

这是您的实际缩进吗?阅读代码使用每个缩进1到5个字符的随机组合是非常困难的... – abarnert 2013-03-05 20:09:47

回答

3

当你import第二个模块,你不这样做的if __name__ == "__main__":部分。 (这就是这个习惯用法的要点 - 提供当你是顶级脚本时运行的代码,但不是当你是import ed。)所以,你永远不会创建Tk应用程序和主事件循环,这意味着没有Tk代码可以做任何事情,并且您的GUI永远不会显示。

但是你试图仅通过移动代码到一个函数,把它解决这一问题之前,你不能只是调用从pygame一个tkinter主事件循环,因为这样的话pygame循环将被阻止,直到tkinter应用退出。

我觉得你的困惑在于你在混淆模块,脚本和过程以及其他一些东西,并将它们全部称为“程序”。请参阅下面的差异入门。

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

  • pygame可以用任何你想要的事件循环工作,只要你钩东西的权利。这意味着您可以创建顶级tkinter应用程序并在其下运行pygame代码。
  • 您可以保留现有的pygame循环,并在另一个线程中运行tkinter循环。
  • 改为将tkinter填入pygame GUI toolkits之一。
  • 如果您真的想将每个模块视为“正在运行程序”,就像您在描述中所说的那样,实际上是这样做的:使用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永远是真实的,所以这是不必要的,而且也没有办法,你可以获取到elif pos == 5:,所以也没有办法退出。

+0

在另一个线程中运行tkinter循环不是一个好主意。它的设计只能在主线程中运行。 – 2013-03-05 20:33:23

+0

@BryanOakley:是的,但你可以在主线程中运行'tkinter'循环,并产生第二个线程来运行'pygame'循环,只要它们使用某种适当的方式相互发送信号(例如, 'Queue',甚至一个全局变量和一个'Lock',只要他们不直接调用方法就可以),它可以正常工作。 – abarnert 2013-03-05 20:51:52

+0

对不起,不太清楚这是如何工作的。你是说你不能把tkinter表单作为一个不同的文件,你不能导入它?你需要在python代码中使它成为函数吗? – pluke 2013-03-06 09:40:14