अजगर में टिक्कीर गुई की प्रोग्रामिंग करते समय कक्षाएं क्यों इस्तेमाल करें


19

मैं मुख्य रूप से अजगर में कार्यक्रम करता हूं और जीयूआई के टिंकर के साथ एक जोड़े को प्रोग्राम किया है, मैंने कभी देखा है हर ट्यूटोरियल ने जीयूआई के लिए एक वर्ग को परिभाषित करने और उपयोग करने की सिफारिश की है, लेकिन मेरा जीयूआई बिना किसी वर्ग के, केवल प्रक्रियाओं का उपयोग करते हुए त्रुटिपूर्ण रूप से चलता है।

कक्षा का उपयोग क्यों करें? यह मेरे दृष्टिकोण से लगता है कि बस जटिलता और अनावश्यक कोड की एक अतिरिक्त परत है।

जवाबों:


19

कक्षा का उपयोग क्यों करें? क्योंकि यह काम को आसान बनाता है, यह मानते हुए कि आप ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग करना जानते हैं, और यह मानते हुए कि आप एक गैर-तुच्छ GUI लिख रहे हैं। वस्तुओं का उपयोग करने से आप आसानी से अपने कोड को उन मॉड्यूलर इकाइयों में विभाजित कर सकते हैं जो स्वयं निहित हैं, और आपके कोड को सामान्य रूप से संशोधित करना एक सर्वोत्तम अभ्यास माना जाता है।

GUI प्रोग्रामिंग आसानी से एक ऑब्जेक्ट-ओरिएंटेड स्टाइल के लिए उधार देता है, क्योंकि GUI पूरी तरह से वस्तुओं से बना है - लेबल, बटन, स्क्रॉलबार, टेक्स्ट क्षेत्र, आदि। चूंकि आप पहले से ही वस्तुओं का उपयोग कर रहे हैं, अपने कोड को बड़ी वस्तुओं में व्यवस्थित करने से समझ में आता है। । टूलबार एक ऑब्जेक्ट है, स्टेटबार एक ऑब्जेक्ट है, नेविगेशन पेन एक ऑब्जेक्ट है, मुख्य क्षेत्र एक ऑब्जेक्ट है, प्रत्येक नोटबुक टैब एक ऑब्जेक्ट है, और इसी तरह।

यहां तक ​​कि जब आपका कोड बहुत जटिल नहीं होता है, तो अधिक व्यावहारिक दृष्टिकोण से यह आपको उस फ़ंक्शन की परिभाषा की तुलना में फ़ाइल में पहले बाइंडिंग और कॉलबैक को परिभाषित करने देता है, जो मुझे लगता है कि बहुत अधिक समझ में आता है।

उदाहरण के लिए, एक साधारण उदाहरण पर विचार करें (यह मानते हुए कि टिंकर आयात किया गया है जैसे import tkinter as tk(पायथन 3) या पाइथन 2 import Tkinter as tk):

def quit(event=None):
    sys.exit()
root = tk.Tk()
label = tk.Label(root, text="Hello, world")
label.pack()
label.bind("<1>", quit)
root.mainloop()

मेरे लिए, उस कोड का प्रवाह सभी गलत है। इससे पहले कि मैं इसे संदर्भित करता हूं, मुझे रूट विधि को परिभाषित करना होगा, और रूट विंडो के निर्माण और मेनलूप के लिए कॉल अन्य सभी कोड द्वारा अलग किए गए हैं।

कक्षाओं का उपयोग करके, हालांकि, मैं कोड को अधिक प्राकृतिक क्रम में लिख सकता हूं:

class MyWindow(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Hello, world")
        label.pack()
        label.bind("<1>", self.quit)
    def quit(self, event=None):
        sys.exit()

root = tk.Tk()
MyWindow(root).pack()
root.mainloop()

GUI का मुख्य निकाय फ़ाइल के शीर्ष पर सही है, और सहायक कोड इसके नीचे है। अब, ज़ाहिर है, आप एक ही चीज़ को प्राप्त करने के लिए फ़ंक्शन का उपयोग कर सकते हैं। हालांकि, मेरी राय में, कक्षाएं इसे थोड़ा आसान बनाती हैं।

एक और लाभ यह है कि मैं अब आसानी से "मुख्य" विंडो (और वीज़ा वर्सा) के बारे में कुछ भी बदलने के बिना युक्त विंडो को आसानी से बदल सकता हूं। यही है, मैं मुख्य GUI में सीमाएँ, या एक नया अनुभाग जोड़ सकता हूं, लेकिन मुझे MyWindow के अंदर कोड की एक भी पंक्ति को स्पर्श करने की आवश्यकता नहीं है। कंट्रास्ट कोड के साथ, जहां आपको label.pack()बयान बदलना पड़ सकता है , और यूआई में अन्य सभी विगेट्स के पैक (या ग्रिड) स्टेटमेंट के साथ कंट्रास्ट करें ।

हालांकि, कहा जा रहा है कि किसी वस्तु उन्मुख दृष्टिकोण का उपयोग करना अच्छा, स्वच्छ, बनाए रखने योग्य कोड लिखने के लिए आवश्यक नहीं है। यह हो सकता है, लेकिन यह खराब कोड भी हो सकता है। दिन के अंत में, एक वस्तु-उन्मुख दृष्टिकोण केवल एक उपकरण है। आप इसका उपयोग करते हैं या नहीं, और क्या आप इसे सही तरीके से उपयोग करते हैं या नहीं यह बहुत सारे कारकों पर निर्भर करता है। तो यह बहुत अच्छी तरह से हो सकता है कि आपके लिए, और आपके द्वारा लिखे गए कोड के लिए , एक कार्यात्मक शैली पूरी तरह से स्वीकार्य है। मुझे लगता है कि आप पाएंगे कि जैसे-जैसे आपके कार्यक्रम अधिक जटिल होते जाते हैं, एक वस्तु-उन्मुख दृष्टिकोण आपके कोड को व्यवस्थित और बनाए रखना आसान बना देगा।


आपने दूसरे उदाहरण में फ़्रेम का उपयोग क्यों किया? क्या आप इससे नहीं बच सकते जैसे आपने पहले उदाहरण में किया था? क्या कक्षाओं के साथ फ़्रेम का उपयोग करने के पीछे कोई रहस्य है?
मल्टीगुडवर्स

2
फ्रेम बस सुविधा के लिए है। फ़्रेम से विरासत में कोई रहस्य नहीं है। मुझे objectया किसी अन्य वर्ग से विरासत में मिला हो सकता है , लेकिन मैं आमतौर पर वैसे भी एक फ्रेम बना रहा हूं। अगर मैं एक फ्रेम में सब कुछ डाल रहा हूं, तो कक्षा को एक फ्रेम बनाने के लिए यह समझ में आता है। ।
ब्रायन ओकले

1
समझ में आता है, धन्यवाद! इसके अलावा, मैंने देखा है कि अन्य लोग चर से पहले स्वयं का उपयोग करते हैं, लेकिन मुझे लगता है कि आप label=tk.Label()इसके बजाय कुछ का उपयोग कर रहे हैं self.tk.Label()। क्या वह स्टाइल पसंद है? यहाँ स्व का उपयोग करते हुए एक उदाहरण है: python-textbok.readthedocs.org/en/1.0/…
multigoodverse

1
@BryanOakley, मुझे लगता है कि आप MyWindow .__ init__ की निम्न पंक्ति में मूल के बजाय माता-पिता का उपयोग करने का मतलब है: "लेबल = tk.Label (मूल, पाठ =" हैलो, दुनिया ")"
user3838927

1
@ user3885927: हाँ! वाह, किसी को यह नोटिस करने में लगभग तीन साल लग गए। हालांकि, नहीं parent, बल्कि self, क्योंकि वर्ग ही एक फ्रेम है। धन्यवाद!
ब्रायन ओकले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.