Я пишу программу клиент-сервер в Python с Tkinter. Мне нужен сервер для отслеживания подключенных клиентов. Для этого я хотел бы, чтобы клиент отправил автоматическое сообщение на сервер после нажатия кнопки выхода (стандартный «X» в углу). Как узнать, когда пользователь выходит из программы?Перехват команды Tkinter «Выход»?
ответ
Вы хотите использовать метод верхнего уровня окна wm_protocol. В частности, вас интересует протокол WM_DELETE_WINDOW
. Если вы используете этот метод, он позволяет зарегистрировать обратный вызов, который вызывается при уничтожении окна.
Использование:
root.protocol("WM_DELETE_WINDOW", app.on_delete)
Итак, я добавил эту строку: 'root.protocol (" WM_DELETE_WINDOW ", app.on_delete())' прямо перед моим вызовом 'root.mainloop()' but 'on_delete() 'вызывается, когда окно открыто *, а не когда оно закрыто. Я делаю что-то неправильно? – John
@John: метод 'protocol' принимает ссылку на функцию. Добавляя конечную скобку, вы вызываете 'app.on_delete' и передаете результат этого метода обработчику протокола. Правильное использование - 'root.protocol (« WM_DELETE_WINDOW », app.on_delete)' –
Отлично! Благодаря! – John
FWIW: Также можно назначить поведение виджета-специфичны.
Если вы хотите, чтобы какое-либо действие произошло, когда конкретный виджет был уничтожен, вы можете рассмотреть возможность переопределения метода destroy(). Смотрите следующий пример:
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()
При нажатии кнопки «b2» нажата, рамка «е» разрушается, с ребенком «b1» и «Yo!» печатается.
Я отправил тот же ответ на this topic.
В моем случае, следующий код не работает:
root.protocol("WM_DELETE_WINDOW", app.on_delete) # doesn't work
Однако он работал, используя эту форму:
root.wm_protocol ("WM_DELETE_WINDOW", app.on_delete) # does work
Нет ответа на использование '.protocol', хотя ... принятый ответ уже сказал использовать' .wm_protocol'. – ArtOfWarfare
Вы можете использовать Python atexit
модуль.
Например:
import atexit
def doSomethingOnExit():
pass
atexit.register(doSomethingOnExit)
Это отлично сработало для меня. Другие никогда не запускались. – ArtOfWarfare
- 1. Ошибка команды event_generate команды Tkinter
- 2. Основные команды в Tkinter
- 3. Команды кнопок в Tkinter
- 4. Команды команды Tkinter Menu работают с аргументами?
- 5. Tkinter Loop Никогда Выход Чистоплотный
- 6. Скремблирование запасов - выход в tkinter
- 7. Выход команды консоли Yii2
- 8. Выход команды git pull
- 9. Выход код перенаправлены команды
- 10. Выход из команды ping
- 11. Выход команды HDFS fsck
- 12. Перехват innerHTML и выполнение другой команды
- 13. Пасс выход команды в п.м. -r команды
- 14. Выход команды команды на чтение через gzip
- 15. Получить выход из команды удаленной команды
- 16. Python 3 - команды кнопки Tkinter
- 17. одновременные команды Tkinter и Shell
- 18. Добавление команды в Tkinter OptionMenu?
- 19. Команды кнопок Tkinter для цикла
- 20. Выход команды Linux не перенаправляется
- 21. Баш выход pgrep странно команды
- 22. выход команды попадает в массив
- 23. Временный выход из команды оболочки
- 24. Shell выход подкомандой родительской команды
- 25. Отсутствует выход из команды подпроцесса
- 26. Выход команды журнала Symfony 2
- 27. Странный выход для команды lb
- 28. Перехват кнопки закрытия окна (окно Tkinter) вызывает ошибку Tcl
- 29. Выход Python OpenCV на удаление метки Tkinter
- 30. Как получить выход радиокнопки в Tkinter?
возможно дубликат [? Как обрабатывать закрытия окна события в Tkinter] (http://stackoverflow.com/questions/111155/how-do-i-handle- the-window-close-event-in-tkinter) – nbro