2013-02-12 18 views
5

Chociaż jestem rodzajem eksperymentalnego programisty w innych językach, jestem bardzo nowy w Pythonie. Próbowałem zrobić bardzo prostą rzecz, która polega na opuszczeniu pętli głównej po uruchomieniu. Wygląda na to, że to wielka sprawa. Poniższy program tworzy tylko sekwencję zdarzeń. Wszystko wydaje się działać, ale nie jestem w stanie zamknąć ostatniego okna ... Co powinienem zrobić?zamknięcie mainloopa w pytonie

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

możesz użyć 'root .withdraw()' – user19911303

Odpowiedz

4

połączeń root.quit() nie 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() 

Ponadto, nie ma potrzeby, aby uczynić klasę CloseEnd jeśli wszystko, co chcesz zrobić, to wywołać funkcję root.quit.

+0

Dziękujemy! Ale po naciśnięciu przycisku TheEnd program zostanie zablokowany! Używam Pythona 2.7.3! Przy okazji, jaka jest korzyść z definiowania Tkintera jako tk? Widziałem też inne osoby, ale nie rozumiałem powodu! – DanielTheRocketMan

+0

Czy używasz IDE? Jeśli tak, spróbuj uruchomić skrypt z poziomu wiersza poleceń: 'python script.py'. Myślę, że powinno to działać dobrze. – unutbu

+1

Chociaż niektórzy mogą argumentować, że 'import * z Tkinter' jest w porządku - rzeczywiście, myślę, że autor' Tkintera' zaprojektował go do zaimportowania w ten sposób - * ogólnie * należy używać tylko 'import * ...' w sesjach interaktywnych, a nie w skryptach. Używając bardziej szczegółowego 'import Tkinter jako tk', dokładnie wyjaśniasz, skąd pochodzi każdy obiekt. Pomaga to w debugowaniu lub czytaniu kodu innych osób i zapobiega kolizjom nazw, gdy dwa moduły używają tych samych nazw. Na przykład 'numpy.sum' jest inny niż wbudowana suma' Pythona'. 'import * from numpy' byłoby okropne. – unutbu