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?
Odpowiedz
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)
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
@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)' –
Perfect! Dzięki! – John
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.
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
Nie ma odpowiedzi na to, by używać '.protocol', chociaż ... zaakceptowana odpowiedź mówi już o użyciu' .wm_protocol'. – ArtOfWarfare
Można użyć Python moduł atexit
.
Na przykład:
import atexit
def doSomethingOnExit():
pass
atexit.register(doSomethingOnExit)
To zadziałało idealnie dla mnie. Pozostałe nigdy nie zostały uruchomione. – ArtOfWarfare
- 1. Intercept JDBC Connection
- 2. komenda altana Nie znaleziono
- 3. TKInter keypress, keyrelease events
- 4. Intercept C++ niejawna kopia konstruktor, lub wywołać jego funkcjonalność
- 5. R: Komenda sample() podlegająca ograniczeniu
- 6. Komenda przerwania GLSL
- 7. Komenda niestandardowa Xamarin UWP
- 8. mv równoważne rsync Komenda
- 9. komenda hadoop fs -put
- 10. Komenda Heroku rake
- 11. Komenda obsługująca Java Merge
- 12. Detect pusty komenda
- 13. błąd: nieprawidłowa komenda 'bdist_egg'
- 14. cięcie komenda nowalinia
- 15. Komenda aktualnej wersji Subversion
- 16. Różnica między import tkinter jako tk i from tkinter import
- 17. tkinter: sprawdź zmodyfikowany
- 18. Plik otwierający (Tkinter)
- 19. Wiązanie kontrolne + liczba Tkinter
- 20. Python Tkinter Poprawna wymowa
- 21. pyton tkinter zmaksymalizować okno
- 22. Python: Tkinter & turtle
- 23. Aplikacja pełnoekranowa Tkinter
- 24. Pozycja myszy Python Tkinter
- 25. tkinter w widgecie
- 26. tkinter showinfo python 3
- 27. Tkinter do tłumaczenia Android
- 28. AttributeError in tkinter
- 29. Tkinter: Widżet drzewa
- 30. Komenda Echo, a następnie uruchom? (Jak make)
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