2009-10-08 10 views
8

मैं पाइथन सीखते समय एक साधारण छोटी उपयोगिता बना रहा हूं। हिस्सा ठीक काम करता हैनिर्धारित करें कि टिंकर में कौन सा बटन दबाया गया था?

for method in methods: 
    button = Button(self.methodFrame, text=method, command=self.populateMethod) 
    button.pack({'fill': 'x', 'expand': 1, 'padx': 5, 'pady': 3}) 

कि: यह गतिशील रूप से बटन की एक सूची उत्पन्न करता है। हालांकि, मुझे यह जानने की जरूरत है कि self.populateMethod के अंदर कौन से बटन दबाए गए थे। इस बारे में कोई सलाह है कि मैं कैसे बताने में सक्षम हूं?

उत्तर

15

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

def populateMethod(self, method): 
    print "method:", method 

for method in ["one","two","three"]: 
    button = Button(self.methodFrame, text=method, 
     command=lambda m=method: self.populateMethod(m)) 
    button.pack({'fill': 'x', 'expand': 1, 'padx': 5, 'pady': 3}) 
1

ऐसा लगता है कि कमांड विधि किसी ईवेंट ऑब्जेक्ट को पास नहीं किया गया है। प्रत्येक बटन

  • कॉल button.bind('<Button-1>', self.populateMethod) self.populateMethod command के रूप में पारित करने के बजाय करने के लिए

    • सहयोगी एक अनूठा कॉलबैक:

      मैं दो तरीके दिए के बारे में सोच सकते हैं। self.populateMethod को फिर एक दूसरा तर्क स्वीकार करना होगा जो एक ईवेंट ऑब्जेक्ट होगा।

      मानते हैं कि इस दूसरे तर्क को event कहा जाता है, event.widget क्लिक किए गए बटन का संदर्भ है।

  • +0

    मैं दूसरी विधि से किया था और यह मैं क्या चाहते हो रहा है। धन्यवाद! – Sydius

    +0

    यदि आप बिल्ट-इन 'कमांड' विशेषता का लाभ लेने के बजाय 'बाइंड' का उपयोग करते हैं तो आप नेविगेट करने के लिए टिंकर की अंतर्निहित क्षमता का उपयोग करने और कीबोर्ड के साथ बटन क्लिक करने की क्षमता खो देते हैं। बेशक, आप सभी विशेष मामलों को संभालने के लिए बाइंडिंग का एक गुच्छा लागू कर सकते हैं, लेकिन 'कमांड' विशेषता का उपयोग करना आसान है। –

    +0

    @ ब्रायन ओकले: वास्तव में; लैम्बडास का उपयोग करने का आपका सुझाव बहुत साफ है। –