2011-01-10 3 views
6

Я пишу программу клиент-сервер в Python с Tkinter. Мне нужен сервер для отслеживания подключенных клиентов. Для этого я хотел бы, чтобы клиент отправил автоматическое сообщение на сервер после нажатия кнопки выхода (стандартный «X» в углу). Как узнать, когда пользователь выходит из программы?Перехват команды Tkinter «Выход»?

+0

возможно дубликат [? Как обрабатывать закрытия окна события в Tkinter] (http://stackoverflow.com/questions/111155/how-do-i-handle- the-window-close-event-in-tkinter) – nbro

ответ

13

Вы хотите использовать метод верхнего уровня окна wm_protocol. В частности, вас интересует протокол WM_DELETE_WINDOW. Если вы используете этот метод, он позволяет зарегистрировать обратный вызов, который вызывается при уничтожении окна.

Использование:

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

Итак, я добавил эту строку: 'root.protocol (" WM_DELETE_WINDOW ", app.on_delete())' прямо перед моим вызовом 'root.mainloop()' but 'on_delete() 'вызывается, когда окно открыто *, а не когда оно закрыто. Я делаю что-то неправильно? – John

+5

@John: метод 'protocol' принимает ссылку на функцию. Добавляя конечную скобку, вы вызываете 'app.on_delete' и передаете результат этого метода обработчику протокола. Правильное использование - 'root.protocol (« WM_DELETE_WINDOW », app.on_delete)' –

+0

Отлично! Благодаря! – John

1

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.

1

В моем случае, следующий код не работает:

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

Однако он работал, используя эту форму:

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

Нет ответа на использование '.protocol', хотя ... принятый ответ уже сказал использовать' .wm_protocol'. – ArtOfWarfare

5

Вы можете использовать Python atexit модуль.

Например:

import atexit 

def doSomethingOnExit(): 
    pass 

atexit.register(doSomethingOnExit) 
+0

Это отлично сработало для меня. Другие никогда не запускались. – ArtOfWarfare

Смежные вопросы