दिलचस्प पोस्ट
AngularJS के साथ कैसे $ http समकालिक कॉल करें अजगर: एन-लगभग-बराबर-लम्बी विभाजनों में एक सूची का टुकड़ा करना जावास्क्रिप्ट पर गंतव्य यूआरएल कैसे प्राप्त कर सकता है? AngularJS: $ निरीक्षण और $ देखने के तरीके के बीच का अंतर jquery कैसे दर्ज करने के लिए कुंजी दर्ज करें और टैब पर घटना बदलें जावास्क्रिप्ट का उपयोग करने के लिए विशिष्ट समयक्षेत्र का समय कैसे प्राप्त करें? कैसे विंडोज कमांड लाइन से PHP को चलाने के लिए XML या Sqlite, जब एक डाटाबेस के लिए एक्सएमएल ड्रॉप करना है? एक MySQL डंप उत्पन्न करने के लिए एक .php फ़ाइल का उपयोग करना जावा के माड्यूलस को नकारात्मक संख्याओं के साथ करना चाहिए जैसा व्यवहार करना सबसे अच्छा तरीका है? खिड़कियों के लिए नर्स उपलब्ध है? एक आंकड़े के प्रत्येक पंक्ति के लिए कनवर्टर गुण कैसे सेट करें? jQuery के .load () IE में काम नहीं कर रहा है – लेकिन फ़ायरफ़ॉक्स, क्रोम और सफारी में ठीक है बहिष्कृत-आकार के लिए विस्थापन के लिए प्रतिस्थापन: विवश करने के लिए: रेखारेखामोड: आईओएस 7 में? as3 टेक्स्टफील्ड बदलते स्ट्रिंग मान

टकन्नेटर में विगेट्स के एक समूह को एक स्क्रॉलबार जोड़ना

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

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

मैंने विजेट ग्रिड को फ़्रेम में डाल करने की कोशिश की है, लेकिन वह स्क्रॉलबार इंटरफ़ेस का समर्थन नहीं करता है, इसलिए यह काम नहीं करता है:

mainframe = Frame(root, yscrollcommand=scrollbar.set) 

क्या कोई इस सीमा को एक रास्ता बता सकता है? मुझे PyQt में फिर से लिखना और इतना अधिक, सिर्फ एक स्क्रॉलबार जोड़ने के लिए अपने निष्पादन योग्य छवि आकार को बढ़ाने के लिए नफरत है!

वेब के समाधान से एकत्रित समाधान "टकन्नेटर में विगेट्स के एक समूह को एक स्क्रॉलबार जोड़ना"

अवलोकन

आप केवल कुछ विगेट्स के साथ स्क्रॉलबार जोड़ सकते हैं, और रूट विजेट और Frame विगेट्स के उस समूह का हिस्सा नहीं हैं।

सबसे आम समाधान एक कैनवास विजेट बनाने और स्क्रॉलबार को उस विजेट के साथ जोड़ना है। फिर, उस कैनवास में उस फ्रेम को एम्बेड करें जिसमें आपके लेबल विजेट शामिल हैं। फ्रेम की चौड़ाई / ऊंचाई निर्धारित करें और उस कैनवास scrollregion विकल्प में फ़ीड करें ताकि स्क्रॉलियरियेशन फ़्रेम के आकार से बिल्कुल मेल खाता हो।

कैनवास पर टेक्स्ट आइटम सीधे आरेखित करना बहुत मुश्किल नहीं है, इसलिए यदि आप फ्रेम-एम्बेडेड-इन-ए-कैनवास समाधान बहुत जटिल लगते हैं तो आप उस दृष्टिकोण पर पुनर्विचार करना चाह सकते हैं। चूंकि आप एक ग्रिड बना रहे हैं, प्रत्येक टेक्स्ट आइटम के निर्देशांक गणना करना बहुत आसान है, खासकर यदि प्रत्येक पंक्ति एक ही ऊंचाई है (जो शायद यह है कि अगर आप एकल फ़ॉन्ट का उपयोग कर रहे हैं)

कैनवास पर सीधे ड्राइंग के लिए, बस फोंट की रेखा की ऊंचाई को समझें (और इसके लिए कमांड हैं)। फिर, प्रत्येक y समन्वय row*(lineheight+spacing) एक्स समन्वय प्रत्येक कॉलम में व्यापक आइटम के आधार पर एक निश्चित संख्या होगी। यदि आप प्रत्येक स्तंभ को उस स्तंभ के लिए एक टैग देते हैं, तो आप एक ही कमांड के साथ कॉलम में सभी वस्तुओं की एक्स समन्वय और चौड़ाई समायोजित कर सकते हैं।

वस्तु उन्मुख समाधान

ऑब्जेक्ट-उन्मुख दृष्टिकोण का उपयोग करके, फ्रेम-एम्बेडेड-इन-कैनवास समाधान का एक उदाहरण यहां दिया गया है:

 import tkinter as tk class Example(tk.Frame): def __init__(self, root): tk.Frame.__init__(self, root) self.canvas = tk.Canvas(root, borderwidth=0, background="#ffffff") self.frame = tk.Frame(self.canvas, background="#ffffff") self.vsb = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview) self.canvas.configure(yscrollcommand=self.vsb.set) self.vsb.pack(side="right", fill="y") self.canvas.pack(side="left", fill="both", expand=True) self.canvas.create_window((4,4), window=self.frame, anchor="nw", tags="self.frame") self.frame.bind("<Configure>", self.onFrameConfigure) self.populate() def populate(self): '''Put in some fake data''' for row in range(100): tk.Label(self.frame, text="%s" % row, width=3, borderwidth="1", relief="solid").grid(row=row, column=0) t="this is the second column for row %s" %row tk.Label(self.frame, text=t).grid(row=row, column=1) def onFrameConfigure(self, event): '''Reset the scroll region to encompass the inner frame''' self.canvas.configure(scrollregion=self.canvas.bbox("all")) if __name__ == "__main__": root=tk.Tk() Example(root).pack(side="top", fill="both", expand=True) root.mainloop() 

प्रक्रियात्मक समाधान

यहां एक समाधान है जो वस्तुओं का उपयोग नहीं करता है:

 import tkinter as tk def populate(frame): '''Put in some fake data''' for row in range(100): tk.Label(frame, text="%s" % row, width=3, borderwidth="1", relief="solid").grid(row=row, column=0) t="this is the second column for row %s" %row tk.Label(frame, text=t).grid(row=row, column=1) def onFrameConfigure(canvas): '''Reset the scroll region to encompass the inner frame''' canvas.configure(scrollregion=canvas.bbox("all")) root = tk.Tk() canvas = tk.Canvas(root, borderwidth=0, background="#ffffff") frame = tk.Frame(canvas, background="#ffffff") vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview) canvas.configure(yscrollcommand=vsb.set) vsb.pack(side="right", fill="y") canvas.pack(side="left", fill="both", expand=True) canvas.create_window((4,4), window=frame, anchor="nw") frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas)) populate(frame) root.mainloop() 

नोट: इस काम को अजगर 2.x में बनाने के लिए, आयात कथन में Tkinter बजाय Tkinter उपयोग करें