2010-08-17 14 views
10

जब मैं अपने बाध्यकारी फ़ंक्शन को कॉल करता हूं तो विजेट के पाठ को बदलने के लिए Text विजेट क्लास बाइंडिंग के बाद मैं स्वयं ईवेंट को बाध्य करना चाहता हूं। मेरा बाध्यकारी, उदाहरण के लिए self.text.bind("<Key>", self.callback), टेक्स्ट विजेट परिवर्तन में सामग्री से पहले कहा जाता है।टेक्स्ट विजेट द्वारा बाध्य होने के बाद टिंकर टेक्स्ट विजेट में स्वयं की घटनाओं को कैसे बाध्य किया जाए?

+0

आप 'सामान्य बंधन' का उपयोग कर रहे हैं? कृपया कुछ कोड –

+0

self.text.bind ("", self.callback) – vladimar

+0

पर पहले स्वयं को self.callback कहा जाता है और फिर यह कुंजी टेक्स्ट विजेट – vladimar

उत्तर

20

आपके मामले में क्या हो रहा है यह है कि मूल्य को मुद्रित करने के लिए बाध्यकारी वर्ग बाध्यकारी से पहले होता है, और यह वर्ग बाध्यकारी है जो वास्तव में उपयोगकर्ता इनपुट लेता है और इसे विजेट में रखता है। इस समस्या को हल करने के कई तरीके हैं। आप <KeyPress> के बजाय <KeyRelease> पर बाध्य कर सकते हैं, या आप प्रत्येक कुंजी प्रेस पर अपना कोड कॉल करने के लिए अंतर्निहित प्रविष्टि सत्यापन सुविधाओं का उपयोग कर सकते हैं। उस समाधान के साथ आपको सभी आवश्यक डेटा दिए जाएंगे - परिवर्तन से पहले मूल्य, परिवर्तन के बाद मूल्य, दबाए गए कुंजी, आदि

एक और विकल्प है जिसमें ऑर्डर बदलना है संसाधित। चूंकि आपके प्रश्न ने विशेष रूप से आदेश को बदलने का तरीका पूछा है, यही वह है जिसे मैं संबोधित करूंगा।

हालांकि एक बाध्यकारी प्रकट होता है एक विजेट के साथ जुड़े होने के लिए जब आप entry.bind(...) की तरह कुछ करते हैं, आप वास्तव में ("bindtag" या) एक "बाँध टैग" करने के लिए एक बाध्यकारी बताए जा रहे हैं। डिफ़ॉल्ट रूप से प्रत्येक विजेट में एक बाइंडटैग होता है जो विजेट के नाम के समान होता है। अन्य bindtags में विजेट की कक्षा शामिल है (उदाहरण के लिए, "प्रविष्टि"), रूट विंडो का पथ (उदाहरण: "।") और विशेष टैग "सब"। विजेट को बाइंडटैग का एक सेट असाइन किया जाता है जिसे किसी ईवेंट प्राप्त होने पर संसाधित किया जाता है। डिफ़ॉल्ट आदेश सबसे कम से कम-विशिष्ट: विजेट, कक्षा, अपूर्ण, सभी से चला जाता है।

आपके इच्छित परिणाम प्राप्त करने के लिए बाइंडटैग में हेरफेर करने के कुछ तरीके हैं। एक विकल्प bindtags के क्रम को पुनर्व्यवस्थित करना है। बिंदटैग को स्थानांतरित करके जो कक्षा का प्रतिनिधित्व करने वाले बिन्दटैग के बाद विजेट का प्रतिनिधित्व करता है, कक्षा विशिष्ट विजेट पर इसे पार करने से पहले ईवेंट को संभाल लेगी।

एक और विकल्प क्लास बाइंडिंग के बाद एक अतिरिक्त बाइंडटैग जोड़ने के लिए है, और फिर विजेट को प्रदर्शित करने वाले टैग के बजाए इस टैग पर अपनी बाइंडिंग डालें।

दूसरे पर एक क्यों चुनें? आदेश को पुन: व्यवस्थित करके आप उस विजेट पर सभी बाइंडिंग को प्रभावित करेंगे। यदि आपके पास कई बाइंडिंग हैं और कुछ ऑर्डर पर निर्भर हैं (ताकि कर सकते हैं, उदाहरण के लिए, कुछ कीस्ट्रोक को अस्वीकार कर सकते हैं), ऑर्डर बदलने से उन बाइंडिंग्स काम करना बंद कर सकते हैं।

एक नया बाइंडटैग पेश करके, आप चुन सकते हैं कि कौन सी बाइंडिंग कक्षा बाइंडिंग से पहले होती है और इसके बाद क्या होता है।

निम्नलिखित कोड में मैं तीन एंट्री विजेट बना देता हूं। पहला बाइंडटैग के डिफ़ॉल्ट सेट का उपयोग करता है (स्पष्ट रूप से उदाहरण में सेट किया गया है, हालांकि वे डिफ़ॉल्ट के समान हैं)। दूसरा ऑर्डर बदलता है, और तीसरा एक अतिरिक्त बाइंडटैग पेश करता है। कोड चलाएं, फिर प्रत्येक विंडो में फ़ोकस होने पर एक कुंजी दबाएं। ध्यान दें कि पहले प्रविष्टि विजेट में बाध्यकारी हमेशा पीछे एक चरित्र प्रतीत होता है। दोबारा, ऐसा इसलिए है क्योंकि विजेट बाइंडिंग कक्षा बाध्यकारी से पहले चरित्र में विजेट रखती है।

दूसरे और तीसरे उदाहरणों में, बाध्यकारी वर्ग बाध्यकारी के बाद होता है ताकि फ़ंक्शन विगेट्स में परिवर्तन को देख सके।

import Tkinter 

def OnKeyPress(event): 
    value = event.widget.get() 
    string="value of %s is '%s'" % (event.widget._name, value) 
    status.configure(text=string) 

root = Tkinter.Tk() 

entry1 = Tkinter.Entry(root, name="entry1") 
entry2 = Tkinter.Entry(root, name="entry2") 
entry3 = Tkinter.Entry(root, name="entry3") 

# Three different bindtags. The first is just the default but I'm 
# including it for illustrative purposes. The second reverses the 
# order of the first two tags. The third introduces a new tag after 
# the class tag. 
entry1.bindtags(('.entry1', 'Entry', '.', 'all')) 
entry2.bindtags(('Entry', '.entry2', '.', 'all')) 
entry3.bindtags(('.entry3','Entry','post-class-bindings', '.', 'all')) 

btlabel1 = Tkinter.Label(text="bindtags: %s" % " ".join(entry1.bindtags())) 
btlabel2 = Tkinter.Label(text="bindtags: %s" % " ".join(entry2.bindtags())) 
btlabel3 = Tkinter.Label(text="bindtags: %s" % " ".join(entry3.bindtags())) 
status = Tkinter.Label(anchor="w") 

entry1.grid(row=0,column=0) 
btlabel1.grid(row=0,column=1, padx=10, sticky="w") 
entry2.grid(row=1,column=0) 
btlabel2.grid(row=1,column=1, padx=10, sticky="w") 
entry3.grid(row=2,column=0) 
btlabel3.grid(row=2,column=1, padx=10) 
status.grid(row=3, columnspan=2, sticky="w") 

# normally you bind to the widget; in the third case we're binding 
# to the new bindtag we've created 
entry1.bind("<KeyPress>", OnKeyPress) 
entry2.bind("<KeyPress>", OnKeyPress) 
entry3.bind_class("post-class-bindings", "<KeyPress>", OnKeyPress) 

root.mainloop() 
+0

मैं एक विजेट 'टेक्स्ट' पर एक कस्टम बाइंडिंग बनाने और जोड़ने की कोशिश कर रहा हूं, लेकिन जब मैं' टेक्स्ट 'पर लिखने की कोशिश करता हूं, तो मैं नहीं कर सकता, कुछ भी नहीं होता है। यह कोड है: 'self.tab1.text.bindtags ((' टैब 1 ',' फ़्रेम ',' एन-बाइंडिंग ','। ',' सब ')) self.tab1.text.bind_class (' n -बाइंडिंग ',' ', self.bottom_bar.on_key_pressed) ' – nbro

+0

@ एनब्रो: ऐसा लगता है कि आपने डिफ़ॉल्ट' टेक्स्ट' बाइंडटैग को हटा दिया है, इसलिए विजेट के साथ कोई टेक्स्ट विजेट बाइंडिंग संबद्ध नहीं है। –

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