2025, Oct 30 18:02

Tkinter ScrolledText में width और height पिक्सेल में चौकोर क्यों नहीं, और सही आकार कैसे तय करें

जानें कि Tkinter ScrolledText में width वर्णों में और height पंक्तियों में मापी जाती है, इसलिए पिक्सेल में चौकोर नहीं दिखता। फ़ॉन्ट मेट्रिक्स पर भरोसेमंद आकार चुनने की विधि।

Tkinter में scrolledtext.ScrolledText से टेक्स्ट एरिया बनाते समय width और height को एक ही मान देने से विजेट पिक्सेल में चौकोर नहीं होता। आप width=50 और height=50 आज़माएँ तो लगेगा कि चौड़ाई लगभग ऊँचाई की आधी दिख रही है, और जैसे ही width को 100 करते हैं, रूप “सही” लगने लगता है। ऐसा क्यों होता है और विजेट का आकार भरोसेमंद तरीके से कैसे तय करें—यहाँ समझें।

कोड में यह हैरानी दोहराकर देखें

नीचे दिया गया न्यूनतम उदाहरण समान width और height के साथ एक ScrolledText बनाता है। यह आयत जैसा दिखता है क्योंकि ये मान पिक्सेल नहीं होते।

import tkinter as tk
from tkinter import scrolledtext
app = tk.Tk()
text_area = scrolledtext.ScrolledText(app, width=50, height=50)
text_area.pack(fill="both", expand=True)
app.mainloop()

अंदरूनी तौर पर वास्तव में क्या होता है

ScrolledText विजेट में width वर्णों (characters) में और height पंक्तियों (lines) में मापी जाती है। यहाँ बराबर संख्याएँ “वर्णों और पंक्तियों की समान गिनती” दर्शाती हैं, न कि “एक जैसे पिक्सेल आयाम”। वास्तविक पिक्सेल आकार प्रयोग में आए फ़ॉन्ट के मेट्रिक्स पर निर्भर होता है। एक ठोस उदाहरण में height=58 और width=58 देने पर बॉक्स 58 वर्ण चौड़ा और 58 पंक्तियाँ ऊँचा बनता है। यदि फ़ॉन्ट लगभग 7 पिक्सेल चौड़ा और 12 पिक्सेल ऊँचा है, तो यह लगभग 406x696 पिक्सेल निकलता है, जो साफ़ तौर पर आयताकार है। उसी फ़ॉन्ट में केवल width को 100 करने पर लगभग 700x696 पिक्सेल मिलते हैं, जो क़रीब-क़रीब चौकोर दिखता है। यह व्यवहार इस्तेमाल किए गए फ़ॉन्ट के साथ बदल भी सकता है, इसलिए माप की परिभाषा समझने के लिए टूलकिट के दस्तावेज़ देखना बेहतर है। Tkinter, Tcl/Tk का Python इंटरफ़ेस है, और text जैसे विजेट्स का आधिकारिक विवरण Tcl/Tk की ओर दस्तावेजीकृत है।

समाधान: वर्णों और पंक्तियों के आधार पर आयाम चुनें

क्योंकि width वर्णों में और height पंक्तियों में है, दोनों को स्वतंत्र रूप से समायोजित करें जब तक कि बनने वाला पिक्सेल आकार आपकी अपेक्षित रूपरेखा से मेल न खा जाए। ऊपर बताए गए समान हालात में लगभग चौकोर रूप पाने के लिए, अधिक पंक्तियों की गिनती को अधिक वर्ण-चौड़ाई के साथ जोड़ें।

import tkinter as tk
from tkinter import scrolledtext
app = tk.Tk()
near_square = scrolledtext.ScrolledText(app, width=100, height=58)
near_square.pack(fill="both", expand=True)
app.mainloop()

यह संयोजन पहले वाले उदाहरण से मेल खाता है, जहाँ height=58 और width=100 देने पर विजेट लगभग 700x696 पिक्सेल आता है—उन फ़ॉन्ट मेट्रिक्स के साथ यह क़रीब-क़रीब चौकोर है।

यह विवरण क्यों मायने रखता है

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

निष्कर्ष

scrolledtext.ScrolledText के लिए सोच को टेक्स्ट इकाइयों में रखें: width = वर्ण, height = पंक्तियाँ। समान मान पिक्सेल में चौकोर होने की गारंटी नहीं देते। यदि किसी विशिष्ट दृश्य अनुपात की ज़रूरत हो, तो इन दोनों मानों को उसी अनुसार समायोजित करें। अंतिम पिक्सेल आकार सक्रिय फ़ॉन्ट मेट्रिक्स पर टिका होता है, और text विजेट का निर्णायक व्यवहार Tcl/Tk की डॉक्यूमेंटेशन में वर्णित है। इसे ध्यान में रखकर आप ScrolledText का आकार अंदाजे से नहीं, बल्कि जान-बूझकर तय कर सकते हैं।

यह लेख StackOverflow पर प्रश्न (लेखक: Aadvik) और cup के उत्तर पर आधारित है।