2011-01-10 19 views
6

Piszę program klient-serwer w Pythonie z Tkinter. Potrzebuję serwera do śledzenia podłączonych klientów. W tym celu chciałbym, aby klient wysłał automatyczną wiadomość do serwera po kliknięciu przycisku wyjścia (standardowy "X" w rogu). Skąd mam wiedzieć, kiedy użytkownik opuszcza program?Komenda "Wyjście" Intercept Tkinter?

+0

możliwe duplikat [? W jaki sposób obsłużyć zdarzenia zamknięcia okna w Tkinter] (http://stackoverflow.com/questions/111155/how-do-i-handle- the-window-close-event-in-tkinter) – nbro

Odpowiedz

13

Chcesz użyć metody wm_protocol w oknie głównym. W szczególności interesuje Cię protokół WM_DELETE_WINDOW. Jeśli użyjesz tej metody, możesz zarejestrować wywołanie zwrotne, które jest wywoływane, gdy okno jest niszczone.

Zastosowanie:

root.protocol("WM_DELETE_WINDOW", app.on_delete) 
+0

Więc dodałem tę linię: 'root.protocol (" WM_DELETE_WINDOW ", app.on_delete())' tuż przed moim wywołaniem 'root.mainloop()' ale 'on_delete() 'zostaje wywołane, gdy okno jest * otwarte *, a nie kiedy jest zamknięte. czy robię coś źle? – John

+5

@John: metoda 'protocol' przyjmuje odwołanie do funkcji. Dodając końcowy nawias, wywołujesz 'app.on_delete' i przekazujesz wynik tej metody do procedury obsługi protokołu. Prawidłowe użycie to 'root.protocol (" WM_DELETE_WINDOW ", app.on_delete)' –

+0

Perfect! Dzięki! – John

1

FWIW: Możliwe jest także przypisanie zachowanie widget specyficzne.

Jeśli chcesz, aby akcja została wykonana po zniszczeniu określonego widgetu, możesz rozważyć zastąpienie metody destroy(). Zobacz poniższy przykład:

class MyButton(Tkinter.Button): 
    def destroy(self): 
     print "Yo!" 
     Tkinter.Button.destroy(self) 

root = Tkinter.Tk() 

f = Tkinter.Frame(root) 
b1 = MyButton(f, text="Do nothing") 
b1.pack() 
f.pack() 

b2 = Tkinter.Button(root, text="f.destroy", command=f.destroy)   
b2.pack() 

root.mainloop() 

Po naciśnięciu przycisku „b2” rama „f” jest zniszczona, z dzieckiem „B1” i „Yo!” jest drukowany.

Napisałem tę samą odpowiedź na this topic.

1

W moim przypadku, poniższy kod nie działa:

root.protocol("WM_DELETE_WINDOW", app.on_delete) # doesn't work 

Jednak to działało za pomocą tego formularza:

root.wm_protocol ("WM_DELETE_WINDOW", app.on_delete) # does work 
+0

Nie ma odpowiedzi na to, by używać '.protocol', chociaż ... zaakceptowana odpowiedź mówi już o użyciu' .wm_protocol'. – ArtOfWarfare

5

Można użyć Python moduł atexit.

Na przykład:

import atexit 

def doSomethingOnExit(): 
    pass 

atexit.register(doSomethingOnExit) 
+0

To zadziałało idealnie dla mnie. Pozostałe nigdy nie zostały uruchomione. – ArtOfWarfare