2013-03-07 7 views
5

बाध्य करने के लिए मैं इसअजगर Tkinter कैनवास कुंजीपटल

from Tkinter import * 
root = Tk() 
def callback(event): 
    print "callback" 
w = Canvas(root, width=300, height=300) 
w.bind("<Key>", callback) 
w.pack() 
root.mainloop() 

हालांकि जैसे एक छोटे स्क्रिप्ट चलाने किया गया है असफल, कीबोर्ड घटना मेरी स्थिति में नहीं संभाला है

(मैं खिड़की 7 पर अजगर 2.7 का उपयोग करें)

अगर मैं का उपयोग

w.bind("<Button-1>", callback) 

चीजें ठीक काम करते हैं।

तो, यह वास्तव में मुझे पहेली करता है। कृपया कोई मुझे बताएं कि यह क्यों हो रहा है, अग्रिम धन्यवाद।

+0

इसे देखें http://stackoverflow.com/questions/13326940/python-tkinter-how-to-bind-key-to-a-button – user19911303

उत्तर

6

कुंजी बाइंडिंग केवल तब आग लगती है जब कुंजीपटल फोकस वाला विजेट एक महत्वपूर्ण घटना प्राप्त करता है। डिफ़ॉल्ट रूप से कैनवास कीबोर्ड फ़ोकस प्राप्त करता है। आप इसे focus_set विधि के साथ फोकस कर सकते हैं। आम तौर पर आप माउस बटन पर बाध्यकारी में ऐसा करेंगे।

अपने कोड में बाध्यकारी निम्नलिखित जोड़ कर कैनवास में क्लिक करें और अपनी कुंजी बाइंडिंग का काम शुरू कर देंगे:

w.bind("<1>", lambda event: w.focus_set()) 
+1

धन्यवाद ब्रायन, यह फोकस समस्या है। हालांकि कोड थोड़ा अलग है। मैं इसे इनलाइन 'w.focus_set() w.bind (' ', फ़ंक्शन) द्वारा काम करता हूं' –

+0

@RobertBean: बस इसे स्पष्ट करने के लिए - आपको बाइंडिंग से पहले फोकस_सेट करने की आवश्यकता नहीं है। कीबोर्ड का उपयोग शुरू करने से पहले फोकस_सेट बस किया जाना चाहिए। –

+0

मुझे यह भी समझ में नहीं आता कि क्यों @ ब्रायनऑक्ली ने इनलाइन w.focus_set() का उपयोग करने के बजाय w.focus_set() के साथ माउस क्लिक को बाध्य करने का दबाव दिया है। – wsysuper

2

"कैनवास पर क्लिक कुंजी बाइंडिंग सक्रिय करने के लिए" से बचने के लिए, मैंने पाया निम्न साइट पर सरल कोड:

http://ubuntuforums.org/showthread.php?t=1378609

उन्होंने कहा कि एक फ्रेम बाध्य करने के लिए प्रयास कर रहा है, लेकिन मैं अपने खुद के कोड में इसे लागू किया और कैनवास विजेट के रूप में अच्छी तरह से काम करता है। आपका कोड निम्नलिखित तरह दिखेगा:

w.focus_set() 
w.bind(<Key>, callback) 
1

वहाँ tkinter में एक आसान घटना दर्ज करें "" कहा जाता है, कि पटरियों जब माउस एक विजेट में प्रवेश करती है। यदि आप इसे कैनवास से बांधते हैं, और उस घटना के लिए बाध्यकारी कॉलबैक में आप canvas.focus_set, तो जब भी माउस कैनवास पर होता है तो आप फोकस करेंगे, और इस प्रकार कीबोर्ड बाइंडिंग काम करेंगे।

यह तब भी काम करेगा जब कैनवास फोकस खो देता है (किसी अन्य विजेट में टेक्स्ट दर्ज करने के माध्यम से कहें), क्योंकि जब माउस फिर से कैनवास में प्रवेश करता है, तो यह फोकस प्राप्त करेगा।

+1

यह उत्तर कोड स्निपेट के साथ अधिक पूर्ण होगा। –