2013-03-05 151 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