उदाहरण 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()
आईना