2011-11-25 10 views
12

मैं पाइथन के लिए नया हूं और टिंकर के साथ एक प्रोग्राम लिखने की कोशिश कर रहा हूं। नीचे दिए गए हैलो-फ़ंक्शन को क्यों निष्पादित किया गया है? जैसा कि मैं इसे समझता हूं, बटन दबाए जाने पर केवल कॉलबैक निष्पादित किया जाएगा? मैं बहुत उलझन में हूँ ...घोषित होने पर बटन पैरामीटर "कमांड" निष्पादित क्यों किया जाता है?

>>> def Hello(): 
     print("Hi there!") 

>>> hi=Button(frame,text="Hello",command=Hello()) 
Hi there! 
>>> 

उत्तर

25

यह जबकि Button के लिए मानकों सौंपा जा रहा है कहा जाता है:

command=Hello() 

आप समारोह (नहीं यह लौटाई गई मूल्य) पास करना चाहते हैं आप के बजाय करना चाहिए:

command=Hello 

सामान्य function_name में एक समारोह वस्तु है function_name() जो कुछ भी समारोह रिटर्न है। आप तर्क पास करना चाहते हैं

>>> def func(): 
...  return 'hello' 
... 
>>> type(func) 
<type 'function'> 
>>> type(func()) 
<type 'str'> 

, आप एक lambda expression उपयोग कर सकते हैं एक parameterless प्रतिदेय निर्माण करने के लिए: अगर यह और अधिक मदद करता देखें।

>>> hi=Button(frame, text="Hello", command=lambda: Goodnight("Moon")) 

सीधे शब्दों में कहें, क्योंकि Goodnight("Moon") एक लैम्ब्डा में है, इसे तुरंत अमल नहीं होगा, बजाय इंतजार कर रहे हैं जब तक बटन क्लिक किया जाता है।

+0

धन्यवाद! स्पष्ट अनुवर्ती है; मैं तर्क कैसे पास करूं? अब मैं लैम्ब्डा के बारे में पढ़ रहा हूं, ऐसा लगता है कि यह सिर्फ जवाब हो सकता है। – wjakobw

+0

@wjakobw - फ़ंक्शन को तर्क दें या फ़ंक्शन को तर्क के रूप में पास करें? पहले मामले में आप फ़ंक्शन परिभाषा पूर्व में तर्क घोषित करते हैं: 'def func (par1, par2):' बाद में, आप केवल बिना किसी ब्रांड्स के फ़ंक्शन नाम का उपयोग करते हैं, जैसा कि मैंने अपने उत्तर में उल्लिखित किया है। चूंकि आप स्वीकार्य रूप से अजगर के लिए नए हैं, क्या मैं सुझाव दे सकता हूं [यह पढ़ना] (http://www.diveintopython.net/)? पालन ​​करना और बहुत ही सुखद है। – mac

+1

बटन दबाए जाने पर मैं एक वैरिएबल को तर्क के रूप में पास करना चाहता हूं। सामान्य तरीका कमांड = हैलो (तर्क) कॉलबैक के रूप में काम नहीं करेगा, फिर पैराथेसिस होगा और फ़ंक्शन के बजाय रिटर्न-वैल्यू का उपयोग करेगा। * उपरोक्त उदाहरण में हैलो-फ़ंक्शन कोई तर्क नहीं लेता है, लेकिन किसी अन्य मामले की कल्पना करें। – wjakobw

2

तुम भी आदेश तर्क के रूप में एक लैम्ब्डा अभिव्यक्ति का उपयोग कर सकते हैं:

import tkinter as tk 
def hello(): 
    print("Hi there!") 

main = tk.Tk() 
hi = tk.Button(main,text="Hello",command=lambda: hello()).pack() 
main.mainloop() 
+3

यदि आप तर्क पारित नहीं कर रहे हैं तो लैम्ब्डा पूरी तरह अनावश्यक है। तर्कों को पारित करने के लिए लैम्ब्डा का उपयोग करने के तरीके को दिखाकर आप अपना जवाब सुधार सकते हैं। –

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

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