2011-01-10 14 views
6

Python'da Tkinter ile bir istemci-sunucu programı yazıyorum. Bağlı müşterileri takip etmek için sunucuya ihtiyacım var. Bunun için istemcinin çıkış düğmesine (köşedeki standart "X") tıklandıktan sonra sunucuya otomatik bir mesaj göndermesini istiyorum. Kullanıcının programdan çıktığını nasıl bilebilirim?Tkinter "Çıkış" komutunu kesiyor musunuz?

+0

olası yinelenen [? Ben Tkinter pencere yakın olayını işlemek nasıl] (http://stackoverflow.com/questions/111155/how-do-i-handle- window-close-event-in-tkinter) – nbro

cevap

13

Üst düzey pencerenin wm_protocol yöntemini kullanmak istiyorsunuz. Özellikle, WM_DELETE_WINDOW protokolüyle ilgileniyorsunuz. Bu yöntemi kullanırsanız, pencere yok edildiğinde çağrılan bir geri arama kaydettirmenizi sağlar.

Kullanımı:

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

Bu yüzden bu satırı ekledim: root.protocol (root_project) ("WM_DELETE_WINDOW", app.on_delete()) "root.mainloop()' a çağrı yapmadan hemen önce ama on_delete (*) pencere açıldığında * açılır ve kapatıldığında değil. Yanlış bir şey mi yapıyorum? – John

+5

@John: 'protokol' yöntemi bir işleve başvurur. Sondaki parantezin eklenmesiyle, 'app.on_delete' komutunu çağırırsınız ve bu yöntemin sonucunu protokol işleyicisine iletirsiniz. Doğru kullanım 'root.protocol (" WM_DELETE_WINDOW ", app.on_delete)' –

+0

Mükemmel! Teşekkürler! – John

1

FWIW: Bu bir widget özgü davranış atamak da mümkündür.

Belirli bir pencere öğesi yok olduğunda bir eylemin gerçekleşmesini istiyorsanız, destroy() yöntemini geçersiz kılmayı düşünebilirsiniz. , Çerçeve 'f' 'b1' ve çocuk ile yok edilir 'b2' düğmesine basıldığında

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() 

: Aşağıdaki örneğe bakın "Yo!" yazdırılır.

Aynı cevabı this topic'da yayınladım. Benim durumumda

1

, aşağıdaki kod işe yaramadı:

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

Ancak, bu formu kullanarak çalıştı:

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

'.protocol' kullanmak için söylenecek bir cevap yok, ancak ... kabul edilen cevap zaten' .wm_protocol' kullanmak için söylendi. – ArtOfWarfare

5

Python atexit modülünü kullanabilirsiniz. Örneğin

:

import atexit 

def doSomethingOnExit(): 
    pass 

atexit.register(doSomethingOnExit) 
ait
+0

Bu benim için mükemmel çalıştı. Diğerleri hiç tetiklenmedi. – ArtOfWarfare