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