उदाहरण GUI:
मान लीजिए कि मेरे पास GUI है:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
जब एक बटन दबाया जाता है तो क्या होता है
देखें कि कब btnदबाया जाता है यह अपने स्वयं के फ़ंक्शन को कॉल करता है जो button_press_handleनिम्न उदाहरण में बहुत समान है :
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
साथ में:
button_press_handle(btn['command'])
आप बस सोच सकते हैं कि commandविकल्प को सेट किया जाना चाहिए, जिस पद्धति को हम कॉल करना चाहते हैं, उसी के संदर्भ callbackमें button_press_handle।
एक विधि ( कॉलबैक ) कॉलिंग जब बटन दबाया जाता है
बिना तर्क के
अगर printबटन दबाया जाता है तो मैं कुछ करना चाहता था तो मुझे सेट करने की आवश्यकता होगी:
btn['command'] = print # default to print is new line
पर ध्यान दें कमी के ()साथ printविधि है जो अर्थ है कि में छोड़ दिया जाता है: "यह पद्धति का नाम है जो मैं तुम्हें जब दबाया कॉल करना चाहते है लेकिन । यह सिर्फ यह बहुत ही तत्काल कॉल नहीं करते" हालाँकि, मैंने इसके लिए कोई भी तर्क पारित नहीं किया, printइसलिए जब भी इसे बिना तर्क के छापा जाता है तो इसे मुद्रित किया जाता है।
साथ मेंतर्क के
अब यदि मैं उस विधि के लिए भी तर्क देना चाहता हूं जिसे मैं चाहता हूं कि जब बटन दबाया जाए तो मैं अनाम कार्यों का उपयोग कर सकता हूं, जो लंबोदर स्टेटमेंट के साथ बनाया जा सकता है , इस मामले में printअंतर्निहित विधि के लिए, निम्न की तरह :
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
बटन दबाए जाने पर कई तरीकों को कॉल करना
बिना तर्क के
आप lambdaकथन का उपयोग करके भी इसे प्राप्त कर सकते हैं लेकिन इसे बुरा व्यवहार माना जाता है और इस प्रकार मैं इसे यहाँ शामिल नहीं करूँगा। अच्छी प्रथा एक अलग विधि को परिभाषित करने के लिए है multiple_methods, जो कि वांछित तरीकों को कॉल करती है और फिर इसे बटन प्रेस में कॉलबैक के रूप में सेट करती है:
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
तर्क के साथ
अन्य विधियों को कॉल करने के लिए तर्क (ओं) को पारित करने के लिए, फिर से lambdaकथन का उपयोग करें , लेकिन पहले:
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
और फिर सेट करें:
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
कॉलबैक से रिटर्निंग ऑब्जेक्ट (ओं)
साथ ही आगे की टिप्पणी है कि callbackवास्तव में नहीं कर सकते हैं returnक्योंकि यह केवल अंदर कहा जाता है button_press_handleके साथ callback()के रूप में करने का विरोध किया return callback()। यह होता है returnलेकिन नहीं कहीं भी है कि समारोह के बाहर। इस प्रकार आपको वस्तु (एस) को संशोधित करना चाहिए जो वर्तमान दायरे में पहुंच योग्य हैं।
वैश्विक वस्तु संशोधन के साथ पूरा उदाहरण
नीचे दिए गए उदाहरण से btnहर बार बटन दबाए जाने पर पाठ को बदलने वाली विधि को कॉल किया जाएगा :
import tkinter as tk
i = 0
def text_mod():
global i, btn # btn can be omitted but not sure if should be
txt = ("Vicariously", "I", "live", "as", "the", "whole", "world", "dies")
btn['text'] = txt[i] # the global object that is modified
i = (i + 1) % len(txt) # another global object that gets modified
root = tk.Tk()
btn = tk.Button(root, text="My Button")
btn['command'] = text_mod
btn.pack(fill='both', expand=True)
root.mainloop()
आईना