दिलचस्प पोस्ट
जावास्क्रिप्ट + यूनिकोड रीगेक्सेस सत्यापन विफलता के लिए REST API सेवा द्वारा वापस जाने के लिए एक उपयुक्त HTTP स्थिति कोड क्या है? एक दौड़ की स्थिति क्या है? एक जावा कार्यक्रम को निष्पादन योग्य में संकलित करना सीएसएस में एक स्टार-पूर्ववर्ती संपत्ति का मतलब क्या है? एंड्रॉइड में सभी संपर्क के फोन नंबर पढ़ें जावास्क्रिप्ट का उपयोग कर मैं कैसे प्रारूपों को प्रारूपित करूं? ExecJS और जावास्क्रिप्ट रनटाइम नहीं मिला कन्स्ट्रक्टर और एनजीओएनआईआईटीआईटी के बीच अंतर एंड्रॉइड स्टूडियो 0.4 एपीके मेटा-आईएनएफ / एलआईसीएनटीपीटी में कॉपी की गई डुप्लिकेट फाइलें शैल स्क्रिप्ट एन्कोडिंग और रेखा के अंत के प्रति संवेदनशील हैं? ब्राउज़र बैक बटन इवेंट का पता लगाने के लिए – क्रॉस ब्राउज़र PHP चेतावनी: कॉल-टाइम पास-बाय-संदर्भ को बहिष्कृत कर दिया गया है TypeError: str बफर इंटरफ़ेस का समर्थन नहीं करता सी # स्ट्रिंग की जगह काम नहीं करता

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

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

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

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

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 उपयोग करें