2011-12-30 5 views
6

मैं एक बटन को घटना <Return> बाध्य, यह सोचकर कि इस command चलाने के लिए कारण होगा से टकराने के बाद दर्ज करें:बटन को <Return> बाइंडिंग काम नहीं कर रहा जैसा कि उम्मीद की

Button(self.f, text="Print", command=self.Printer).pack(side=RIGHT, padx=10, pady=10) 
self.button1 = Button(self.f, text="search", command=self.search) 
self.button1.bind('<Return>', self.search) 
self.button1.pack(side=RIGHT, padx=10, pady=10) 

लेकिन यह ऐसा नहीं करता है कुछ भी। दर्ज करें जब self.search चलाने के लिए मुझे क्या करना चाहिए?

उत्तर

12

आपका कोड ठीक दिखता है, लेकिन ध्यान दें कि यदि आप self.search() पर कॉल करने के लिए Return चाहते हैं तो फोकस बटन पर होना चाहिए। आप Tab दबाकर विजेट से विजेट पर फ़ोकस बदल सकते हैं। फोकस में विजेट पतली ब्लैक लाइन के साथ उल्लिखित है। Return दबाए जाने से पहले आपको बटन पर ध्यान केंद्रित करने के लिए Tab एक या अधिक बार दबाएं।

आप Return जीयूआई विंडो में कहीं भी काम करने के लिए, तो

self.button1.bind('<Return>', self.search) 

को

root.bind('<Return>', self.search) 

जहां root = tk.Tk() बदलने चाहते हैं।

उदाहरण के लिए, नीचे दिए गए कोड में master.bind साथ button.bind तुलना:

import Tkinter as tk 

class SimpleApp(object): 
    def __init__(self, master, **kwargs): 
     title = kwargs.pop('title') 
     frame = tk.Frame(master, **kwargs) 
     frame.grid() 
     button = tk.Button(frame, text = 'search', command = self.search) 
     button.grid() 
     button.bind('<Return>', self.search) 
     # uncomment if you want `<Return>` bound everywhere. 
     # master.bind('<Return>', self.search) 
    def search(self,*args): 
     print('searching...') 

def basic(): 
    root = tk.Tk() 
    app = SimpleApp(root, title = 'Hello, world') 
    root.mainloop() 

basic() 

वैकल्पिक रूप से, आप

button.bind('<Return>', self.search) 
    button.focus() 

इस्तेमाल कर सकते हैं यह इस तरह से कर रहा, Return कॉल self.search() दबाने केवल जब बटन पर फोकस है, लेकिन ऐप शुरू होने पर बटन फोकस हो जाता है।


*args और **kwargs के उपयोग के बारे में:

**kwargs की अनुमति देता है मनमाना कीवर्ड तर्क __init__ को पास करने की।

जब **kwargs इस तरह एक समारोह परिभाषा प्रयोग किया जाता है:

def __init__(self, master, **kwargs): 

और हम इस तरह SimpleApp का दृष्टांत:

app = SimpleApp(root, title = 'Hello, world') 

तो अजगर एक dict को kwargs सेट कीवर्ड तर्क है, उदा युक्त {'title':'Hello, world'}। ध्यान दें कि **kwargs पायथन सिंटैक्स है जिसे केवल फ़ंक्शन परिभाषाओं और फ़ंक्शन कॉल (नीचे देखें) में उपयोग किया जा सकता है, लेकिन kwargs स्वयं ही एक नियम है।

kwargs तो Frame को पारित कर दिया है:

frame = tk.Frame(master, **kwargs) 

अब, जब ** kwargs एक समारोह कॉल में प्रयोग किया जाता है, kwargs dict में कुंजी-मान जोड़ों ताकि ऊपर समारोह कॉल बराबर है विस्तारित किए जाते हैं

frame = tk.Frame(master, title = 'Hello, world') 

को Frame के बाद से कई कीवर्ड तर्क ले सकते हैं, और मैं उन सभी को पता नहीं है और उन्हें गणना करने की इच्छा नहीं है, यह **kwargs उपयोग करने के लिए लाभदायक है। यह भी ध्यान दें कि अगर कुछ कीवर्ड दिनांक Frame में कुछ बाद की तारीख में जोड़े गए थे, तो भी मेरा कोड काम करेगा, जबकि यदि मैंने स्पष्ट रूप से कीवर्ड की वर्तनी की है तो मेरा कोड स्वचालित रूप से "अपग्रेड नहीं होगा" अगर Frame के स्वीकार्य कीवर्ड बदलना चाहते हैं ।

*args, इसी तरह, आप search को मनमाने ढंग से स्थितीय तर्क शामिल करने के लिए अनुमति देता है:

def search(self,*args): 

अजगर सभी स्थितीय जब search कहा जाता है search के लिए भेजा तर्कों से युक्त एक सूची args सेट।

मैंने उपयोग किया * यहां तर्क देता है क्योंकि self.search को कोई तर्क या एक तर्क नहीं कहा जाता है।

जब आप कहते हैं कि

button = tk.Button(frame, text = 'search', command = self.search) 

self.search() कोई argumens साथ कहा जाता है जब बटन क्लिक किया जाता है। लेकिन जब आप कहते हैं कि

button.bind('<Return>', self.search) 

self.search(event) एक तर्क के साथ कॉल जब Return कुंजी दबाने है। event एक Tkinter.Event है जिसमें विशेषताएँ (समय, राज्य, प्रकार, विजेट, एक्स, वाई, आदि) है जो आपको घटना के बारे में और जानने के लिए अनुमति देता है।

एक और, शायद बेहतर है, जिस तरह से search परिभाषित करने के लिए

def search(self, event = None): 
    ... 

यह स्पष्ट किया कि search पारित किया जा सकता है 0 या 1 तर्क, न कि केवल और तर्कों की आर्बिटरी संख्या बना सकता था हो गया होता। अगर search पर कोई ईवेंट पास किया गया तो यह event तक आसान पहुंच प्रदान करता।

संदर्भ:

+0

धन्यवाद, अब यह मेरे लिए अधिक स्पष्ट है। बस सवाल करें कि उनको क्या खड़ा है: "** kwargs और * args" के लिए? – Thomas

+0

मैंने एक स्पष्टीकरण जोड़ा कि मैंने '** kwargs' और' * args' क्यों उपयोग किया। यदि इसे पढ़ने में बहुत लंबा लगता है, तो [saltcrane की व्याख्या] देखें (http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/)। – unutbu

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