2010-11-28 18 views
7

टिंकर में, मेरे पास बाएं माउस बटन से जुड़े कई विजेट हैं। क्लिक किए जाने पर वे सभी एक ही घटना को ट्रिगर करते हैं।कोई ईवेंट ट्रिगर करने वाले विजेट को प्राप्त करना?

मैं कैसे पुनर्प्राप्त करूं कि विजेट किस क्लिक पर क्लिक किया गया था?

मुझे यह कहना है कि Label2 दबाए जाने पर, मैं Label2 पुनर्प्राप्त करने में सक्षम हूं, जो विजेट ट्रिगर होने के दौरान दबाया गया था।

उत्तर

8

आपके पास कुछ विकल्प हैं। एक तरीका है ईवेंट ऑब्जेक्ट की widget विशेषता का उपयोग करना। एक और तरीका है अपने ऑब्जेक्ट में ऑब्जेक्ट संदर्भ को पास करना। यहां एक उदाहरण दिया गया है जो प्रत्येक में से एक का उपयोग करता है।

import Tkinter as tk 

def OnClickA(event): 
    print "you clicked on", event.widget 
    event.widget.config(text="Thank you!") 


def OnClickB(event, obj): 
    print "you clicked on", obj 
    obj.config(text="Thank you!") 

root = tk.Tk() 
l1 = tk.Label(root, text="Click me") 
l2 = tk.Label(root, text="No, click me!") 
l1.pack() 
l2.pack() 

l1.bind("<1>", OnClickA) 
l2.bind("<1>", lambda event, obj=l2: OnClickB(event, obj)) 

root.mainloop() 
2

लगता है जैसे आपके सभी विजेट एक ईवेंट हैंडलर साझा कर रहे हैं। जॉन डब्ल्यू शिपमैन - एनएम टेक द्वारा Tkinter 8.4 Reference से यह अंश मदद कर सकता है।

30.7. The extra arguments trick

कभी-कभी आप घटना के अलावा कोई हैंडलर के लिए अन्य तर्क पारित करने के लिए करना चाहते हैं।

यहां एक उदाहरण है। मान लीजिए कि आपके एप्लिकेशन में दस चेकबूटन की एक सरणी है जिसका विजेट एक सूची self.cbList में संग्रहीत किया गया है, द्वारा range(10) में चेकबटन संख्या द्वारा अनुक्रमित किया गया है।

आगे मान लीजिए कि आप के सभी दस इन checkbuttons में एक हैंडलर <Button-1> घटनाओं के लिए .__cbHandler नामित लिखना चाहते हैं। हैंडलर वास्तविक Checkbutton विजेट कि यह Event उद्देश्य यह है कि में पारित हो जाता है की .widget विशेषता की चर्चा करते हुए से शुरू हो रहा प्राप्त कर सकते हैं, लेकिन कैसे यह self.cbList में है कि checkbutton के सूचकांक पता लगाना है?

यह इस तरह checkbutton संख्या के लिए एक अतिरिक्त तर्क, कुछ के साथ हमारे हैंडलर लिखने के लिए अच्छा होगा:

def __cbHandler (self, event, cbNumber): 

लेकिन ईवेंट हैंडलर्स केवल एक तर्क, घटना पारित कर रहे हैं। तो हम तर्कों की संख्या में मेल नहीं खाते के कारण उपरोक्त फ़ंक्शन का उपयोग नहीं कर सकते हैं।

सौभाग्य से, की पाइथन की क्षमता फ़ंक्शन तर्कों के लिए डिफ़ॉल्ट मान प्रदान करती है, तर्क हमें एक रास्ता देता है।

def __createWidgets (self): 
     ? 
     self.cbList = [] # Create the checkbutton list 
     for i in range(10): 
      cb = Checkbutton (self, ?) 
      self.cbList.append (cb) 
      cb.grid(row=1, column=i) 
      def handler (event, self=self, i=i): # [1] 
       return self.__cbHandler (event, i) 
      cb.bind ("<Button-1>", handler) 
     ? 
    def __cbHandler (self, event, cbNumber): 
     ? 

# [1] ये लाइनें एक नया कार्य handler कि तीन तर्क की उम्मीद को परिभाषित: इस कोड में एक नज़र डालें।पहला तर्क Event वस्तु सभी घटना संचालकों को पारित कर दिया है, और दूसरे और तीसरे तर्क उनके डिफ़ॉल्ट मूल्यों पर निर्धारित किया जाएगा? अतिरिक्त तर्क हम करने की जरूरत है इसे पारित।

इस तकनीक को तक बढ़ाया जा सकता है,हैंडलर के लिए तर्कों की संख्या को आपूर्ति करें।

एक ऐसा करने के लिए थोड़ा और अधिक संक्षिप्त तरीके से, ब्रायन ओकले his answer में दूसरा बटन के लिए करता है के रूप में, इन-लाइन एक लैम्ब्डा के साथ प्रत्येक हैंडलर समारोह, परिभाषित करने के लिए है यानी .:

def __createWidgets (self): 
    ? 
    self.cbList = [] # Create the checkbutton list 
    for i in range(10): 
     cb = Checkbutton (self, ?) 
     self.cbList.append (cb) 
     cb.grid(row=1, column=i) 
     cb.bind ("<Button-1>", lambda event, self=self, i=i: 
            self.__cbHandler(event, i)) 
    ? 
def __cbHandler (self, event, cbNumber): 
    ? 
संबंधित मुद्दे