2025, Oct 31 19:31

Tkinter में इमेज प्रीव्यू: खाली Label को तय आकार देने का आसान तरीका

Tkinter में इमेज प्रीव्यू खाली Label के कारण लेआउट हिलता है? जानें कैसे PhotoImage से Label को शुरुआत में ही इमेज देकर चौड़ाई/ऊँचाई और स्थिर UI सुनिश्चित करें।

Tkinter में इमेज प्रीव्यू को पहले से आकार देना अक्सर डेवलपर्स को चौंका देता है: उपयोगकर्ता द्वारा अपलोड की जाने वाली तस्वीर के लिए बनाया गया Label तब तक नजर नहीं आता और कोई जगह नहीं घेरता, जब तक उसमें वास्तविक छवि लोड न हो जाए। उसे तय आयामों वाले Frame में लपेटना भी काम नहीं आता। अगर आपका UI पहली बार अपलोड के बाद ही इधर‑उधर खिसकता है या बाकी कंट्रोल्स को सिकोड़ देता है, तो वही व्यवहार सामने है।

वह सेटअप जहाँ समस्या दिखती है

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

from tkinter import filedialog
from tkinter import *
from PIL import Image, ImageTk
# ---------- क्रियाएँ ----------
def on_pick_image():
    chosen_path = filedialog.askopenfilename()
    if chosen_path:
        pil_img = Image.open(chosen_path)
        tk_pic = ImageTk.PhotoImage(pil_img)
        preview_lbl.image = tk_pic
        preview_lbl.config(image=tk_pic)
# ---------- यूआई ----------
root_win = Tk()
canvas_box = Frame(root_win, width=500, height=500)
preview_lbl = Label(canvas_box)
btn_load = Button(root_win, text='Upload Image', command=on_pick_image)
canvas_box.grid(column=3, row=2, columnspan=5, rowspan=10, padx=50)
preview_lbl.pack()
btn_load.grid(column=1, row=1, padx=60, pady=60)
root_win.mainloop()

असल में हो क्या रहा है

जब इमेज लेबल में कोई सामग्री नहीं होती, वह जगह नहीं लेता। उसे चौड़ाई और ऊँचाई वाले Frame में लपेट देने से भी यह व्यवहार नहीं बदलता। नतीजतन लेआउट तभी फैलता है जब पहली छवि लोड होती है — और अचानक हुए इस रिसाइज़ के बाद बाक़ी कंट्रोल्स भी जैसे फिट न आने लगते हैं।

समाधान

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

from tkinter import filedialog
from tkinter import *
from PIL import Image, ImageTk
# ---------- क्रियाएँ ----------
def on_pick_image():
    chosen_path = filedialog.askopenfilename()
    if chosen_path:
        pil_img = Image.open(chosen_path)
        tk_pic = ImageTk.PhotoImage(pil_img)
        preview_lbl.image = tk_pic
        preview_lbl.config(image=tk_pic)
# ---------- यूआई ----------
root_win = Tk()
canvas_box = Frame(root_win)  # स्पष्ट चौड़ाई/ऊँचाई की वास्तव में ज़रूरत नहीं
preview_lbl = Label(canvas_box, image=PhotoImage(), width=500, height=500)
btn_load = Button(root_win, text='Upload Image', command=on_pick_image)
canvas_box.grid(column=3, row=2, columnspan=5, rowspan=10, padx=50)
preview_lbl.pack()
btn_load.grid(column=1, row=1, padx=60, pady=60)
root_win.mainloop()

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

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

निष्कर्ष

Label को शुरुआत में ही किसी इमेज से इनिशियलाइज़ करें। शुरुआती PhotoImage मौजूद होने पर लेबल शुरू से ही चौड़ाई और ऊँचाई का सम्मान करता है, आपका लेआउट स्थिर रहता है, और जब उपयोगकर्ता फ़ाइल अपलोड करता है तो इमेज प्रीव्यू अपेक्षित तरीके से कार्य करता है।

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