2013-02-12 98 views
5

儘管我是其他語言的一種實驗程序員,但我在Python中很新。我一直試圖做一個非常簡單的事情,就是在開始後退出主循環。這似乎是一個大問題。下面的程序只會產生一系列事件。一切似乎都在工作,但我無法關閉最後的窗口......我該怎麼辦?在Python中退出主循環

from Tkinter import * 

root=Tk() 
theMainFrame=Frame(root) 
theMainFrame.pack() 



class CloseAfterFinishFrame1(Frame): # Diz que herda os parametros de Frame 
    def __init__(self): 
     Frame.__init__(self,theMainFrame) # Inicializa com os parametros acima!! 
     Label(self,text="Hi",font=("Arial", 16)).pack() 
     button = Button (self, text = "I am ready", command=self.CloseWindow,font=("Arial", 12)) 
     button.pack()    
     self.pack() 

    def CloseWindow(self): 
     self.forget() 
     CloseAfterFinishFrame2() 



class CloseAfterFinishFrame2(Frame): # Diz que herda os parametros de Frame 
    def __init__(self): 
     Frame.__init__(self,theMainFrame) # Inicializa com os parametros acima!! 
     Label(self,text="Hey",font=("Arial", 16)).pack() 
     button = Button (self, text = "the End", command=self.CloseWindow,font=("Arial", 12)) 
     button.pack() 
     self.pack()   
    def CloseWindow(self): 
     self.forget() 
     CloseEnd() 


class CloseEnd(): 
    theMainFrame.quit() 



CloseAfterFinishFrame1() 

theMainFrame.mainloop() 
+0

你可以使用'root .withdraw()' – user19911303 2013-02-15 10:32:02

回答

4

呼叫root.quit(),不theMainFrame.quit

import Tkinter as tk 

class CloseAfterFinishFrame1(tk.Frame): # Diz que herda os parametros de Frame 
    def __init__(self, master): 
     self.master = master 
     tk.Frame.__init__(self, master) # Inicializa com os parametros acima!! 
     tk.Label(self, text="Hi", font=("Arial", 16)).pack() 
     self.button = tk.Button(self, text="I am ready", 
          command=self.CloseWindow, font=("Arial", 12)) 
     self.button.pack() 
     self.pack() 

    def CloseWindow(self): 
     # disable the button so pressing <SPACE> does not call CloseWindow again 
     self.button.config(state=tk.DISABLED) 
     self.forget() 
     CloseAfterFinishFrame2(self.master) 

class CloseAfterFinishFrame2(tk.Frame): # Diz que herda os parametros de Frame 
    def __init__(self, master): 
     tk.Frame.__init__(self, master) # Inicializa com os parametros acima!! 
     tk.Label(self, text="Hey", font=("Arial", 16)).pack() 
     button = tk.Button(self, text="the End", 
          command=self.CloseWindow, font=("Arial", 12)) 
     button.pack() 
     self.pack() 

    def CloseWindow(self): 
     root.quit() 

root = tk.Tk() 
CloseAfterFinishFrame1(root) 
root.mainloop() 

而且,沒有必要使一個類CloseEnd如果你想要做的就是調用該函數root.quit

+0

謝謝!但按下按鈕後,程序就卡住了!我正在使用python 2.7.3!順便說一下,將Tkinter定義爲tk有什麼優勢?我看到其他人也這樣做,但我不明白原因! – DanielTheRocketMan 2013-02-12 18:13:20

+0

您使用的是IDE嗎?如果是這樣,請嘗試從命令行運行腳本:'python script.py'。我認爲它應該可以正常工作。 – unutbu 2013-02-12 18:20:44

+1

雖然有些人可能會爭辯說,從Tkinter導入*是可以的 - 事實上,我認爲'Tkinter'的作者設計它是以這種方式導入的 - *一般來說*只能使用'import * ...'在交互式會話中,而不是在腳本中。通過使用更加詳細的「導入Tkinter作爲tk」,您可以清楚地確定每個對象來自哪裏。這有助於調試或閱讀其他人的代碼,並防止兩個模塊使用相同名稱時的名稱衝突。例如,'numpy.sum'與內建的Python'sum'不同。 '從numpy'導入*會很糟糕。 – unutbu 2013-02-12 18:27:05