2013-09-30 9 views
6

कृपया नीचे दिए गए कोड को देखने बनाने के लिए:उपवर्गीकरण Tkinter एक कस्टम विजेट

class ScrollableTextWidget(Tkinter.Text): 
    def __init__(self, parent): 
     self.parent = parent 
     self.Frame = ttk.Frame(self.parent) 
     Tkinter.Text.__init__(self, self.Frame, width=1, height=1) 
     self.__initWidget() 

    def __initWidget(self): 
     self.Frame.grid(sticky="NSEW") 
     self.ScrollbarY = ttk.Scrollbar(self.Frame, orient="vertical", command=self.yview) 
     self.configure(yscrollcommand=self.ScrollbarY.set) 
     self.grid(column=0, row=0, sticky="NSEW") 
     self.ScrollbarY.grid(column=1, row=0, sticky="NS") 
     self.Frame.columnconfigure(0, weight=1) 
     self.Frame.rowconfigure(0, weight=1) 
(मैं मूल रूप से, जबकि सभी तरीकों/Tkinter.Text से कार्यों मेरी कक्षा में बनाए रखने के लिए एक ऊर्ध्वाधर स्क्रॉलबार के साथ एक पाठ विजेट बनाने के लिए कोशिश कर रहा हूँ)

क्या यह मेरे कस्टम विजेट को बनाना ठीक है या क्या मुझे इसे फ्रेम में रखना चाहिए और अपनी खुद की विधियां लिखना चाहिए?

उत्तर

2

मैं मध्य, बड़ी परियोजना या भविष्य में समर्थन के साथ प्रोजेक्ट के लिए सबक्लास का उपयोग करूंगा क्योंकि सबक्लासिंग को प्रतिस्थापित या अपडेट करना आसान हो सकता है। किसी भी मामले में उपclassing के लिए लागत छोटी है। लेकिन यदि आपका कार्य डिस्पोजेबल है तो यह गंदा और तेज़ है।

इस मामले में मैं फ़्रेम से उप-वर्गीकरण करूँगा क्योंकि यह सबसे सामान्य विजेट है और pack, grid और अन्य विधियों को ओवरराइड करने की आवश्यकता नहीं है।

+0

क्या मैं पूछने के लिए कोशिश कर रहा हूँ है, यह Tkinter.Text (या किसी अन्य विजेट यह तरीकों और कार्यों है बनाए रखने के लिए) एक कस्टम विजेट बनाने के लिए उपवर्ग के लिए एक अच्छा अभ्यास है। इस मामले में मैं Tkinter.Text subclassing हूँ, इसे मेरी कक्षा के भीतर एक फ्रेम पर एक स्क्रॉलबार के साथ रखकर। या मुझे फ्रेम को उप-वर्ग करना चाहिए और टेक्स्ट विजेट और स्क्रॉलबार को सीधे उस पर रखना चाहिए और अपनी खुद की विधियों और कार्यों को बनाना चाहिए? – user2830098

+0

मेरे उत्तर का अपडेट देखें –

16

एक कस्टम बनाने के लिए विजेट को उप-वर्ग करना बहुत सामान्य है। हालांकि, यदि यह कस्टम विजेट एक से अधिक विजेट से बना है, तो आप आमतौर पर Frame उपclass करेंगे। उदाहरण के लिए, एक विजेट एक स्क्रॉलबार मैं कुछ इस तरह करना होगा के साथ एक पाठ विजेट है कि बनाने के लिए:

import Tkinter as tk 

class ScrolledText(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent) 
     self.text = tk.Text(self, *args, **kwargs) 
     self.vsb = tk.Scrollbar(self, orient="vertical", command=self.text.yview) 
     self.text.configure(yscrollcommand=self.vsb.set) 
     self.vsb.pack(side="right", fill="y") 
     self.text.pack(side="left", fill="both", expand=True) 

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self.scrolled_text = ScrolledText(self) 
     self.scrolled_text.pack(side="top", fill="both", expand=True) 
     with open(__file__, "r") as f: 
      self.scrolled_text.text.insert("1.0", f.read()) 

root = tk.Tk() 
Example(root).pack(side="top", fill="both", expand=True) 
root.mainloop() 

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

import Tkinter as tk 

class ScrolledText(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent) 
     self.text = tk.Text(self, *args, **kwargs) 
     self.vsb = tk.Scrollbar(self, orient="vertical", command=self.text.yview) 
     self.text.configure(yscrollcommand=self.vsb.set) 
     self.vsb.pack(side="right", fill="y") 
     self.text.pack(side="left", fill="both", expand=True) 

     # expose some text methods as methods on this object 
     self.insert = self.text.insert 
     self.delete = self.text.delete 
     self.mark_set = self.text.mark_set 
     self.get = self.text.get 
     self.index = self.text.index 
     self.search = self.text.search 

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self.scrolled_text = ScrolledText(self) 
     self.scrolled_text.pack(side="top", fill="both", expand=True) 
     with open(__file__, "r") as f: 
      self.scrolled_text.insert("1.0", f.read()) 

root = tk.Tk() 
Example(root).pack(side="top", fill="both", expand=True) 
root.mainloop() 
+0

धन्यवाद, यह वास्तव में सहायक था। मैंने वोट देने/अपना उत्तर स्वीकार करने का प्रयास किया, लेकिन दुर्भाग्य से मेरी प्रतिष्ठा बहुत कम है। एक और बात यह है कि, मैं एक टीटीके बनाने के लिए कैसे जाउंगा। उसी तरह से देखें और इसे किसी ईवेंट को बाध्य करने में सक्षम हो ?, क्या मुझे फ्रेम के अंदर ट्रीव्यूव उदाहरण का खुलासा करना चाहिए? – user2830098

+1

आपके समाधान के साथ समस्या ठीक है कि आपको मैन्युअल रूप से टेक्स्ट सदस्य विधियों का पर्दाफाश करना होगा, जबकि ओपी को इसे मुफ्त में प्राप्त करने की उम्मीद थी। इसलिए, मुझे लगता है कि पाठ को उपclassing का उसका मूल विचार जाने का सही तरीका था। मेरा टिंकर मास्टरिंग इस मुद्दे का जवाब देने के लिए बहुत उथला है, लेकिन अगर कोई ऐसा कर सकता तो मुझे खुशी होगी। – quickbug

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