2011-01-10 24 views
6

मैं टिंकर के साथ पायथन में क्लाइंट-सर्वर प्रोग्राम लिख रहा हूं। कनेक्ट किए गए ग्राहकों का ट्रैक रखने के लिए मुझे सर्वर की आवश्यकता है। इसके लिए, मैं क्लाइंट को निकास बटन (कोने में मानक "एक्स") के बाद सर्वर पर एक स्वचालित संदेश भेजना चाहता हूं। जब मैं प्रोग्राम से बाहर निकल रहा हूं तो मुझे कैसे पता चलेगा?इंटरसेप्ट टिंकर "बाहर निकलें" कमांड?

+0

संभव डुप्लिकेट [? मैं Tkinter में विंडो बंद घटना कैसे निपटेंगे] (http://stackoverflow.com/questions/111155/how-do-i-handle- द विंडो-क्लोज-इवेंट-इन-टिंकर) – 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()' पर मेरी कॉल से ठीक पहले 'लेकिन' on_delete() 'खिड़की * खोला गया है * और जब यह बंद हो जाता है तब बुलाया जा रहा है। क्या मुझसे कुछ गलत हो रही है? – John

+5

@ जॉन: 'प्रोटोकॉल' विधि किसी फ़ंक्शन का संदर्भ लेती है। पिछली संश्लेषण जोड़कर आप 'app.on_delete' को कॉल कर रहे हैं और प्रोटोकॉल हैंडलर को उस विधि का परिणाम पास कर रहे हैं। सही उपयोग 'root.protocol (" WM_DELETE_WINDOW ", app.on_delete)' –

+0

बिल्कुल सही है! धन्यवाद! – John

1

FWIW: यह भी एक विजेट-विशिष्ट व्यवहार आवंटित करने के लिए संभव है।

यदि आप एक विशिष्ट विजेट नष्ट होने पर कोई कार्रवाई करना चाहते हैं, तो आप नष्ट() विधि को ओवरराइड करने पर विचार कर सकते हैं। निम्नलिखित उदाहरण देखें:

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

जब बटन 'बी 2' दबाया जाता है, फ्रेम 'म' 'बी 1' और बच्चे के साथ, नष्ट हो जाता है "यो!" मुद्रित है

मैंने उसी उत्तर को 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

आप अजगर atexit मॉड्यूल का उपयोग कर सकते हैं।

उदाहरण के लिए:

import atexit 

def doSomethingOnExit(): 
    pass 

atexit.register(doSomethingOnExit) 
की
+0

यह मेरे लिए पूरी तरह से काम किया। अन्य लोग कभी ट्रिगर नहीं हुए। – ArtOfWarfare

संबंधित मुद्दे