2025, Oct 18 22:31

clam थीम में ttk.Combobox का चयनित टेक्स्ट गायब? ऐसे ठीक करें

Tkinter की clam थीम में readonly ttk.Combobox पर चयनित टेक्स्ट फोकस में सफेद होकर अदृश्य दिखता है। वजह जानें और foreground को state map करके काला सेट कर फिक्स करें.

Tkinter में clam थीम के साथ ttk.Combobox को स्टाइल करते समय, आपको एक उलझाने वाली UX गड़बड़ी मिल सकती है: ड्रॉपडाउन से इंटरैक्ट करने के बाद चुना गया टेक्स्ट जैसे गायब हो जाता है। मान वहीं मौजूद रहता है, लेकिन पढ़ा नहीं जा सकता। यह व्यवहार alt जैसी थीमों में नहीं दिखता, इसलिए यह थीम-विशेष और असंगत महसूस होता है।

समस्या को पुन: उत्पन्न करना

नीचे दिया गया स्निपेट clam थीम में सफेद बैकग्राउंड के साथ एक readonly Combobox तैयार करता है। इंटरैक्शन के दौरान चुना हुआ विकल्प अदृश्य हो जाता है।

import tkinter as tk, tkinter.ttk as ttk
app = tk.Tk()
styler = ttk.Style(app)
styler.theme_use("clam")
styler.configure("TCombobox", fieldbackground="white", background="white")
styler.map("TCombobox", fieldbackground=[("readonly", "white")], background=[("readonly", "white")])
chooser = ttk.Combobox(app, state="readonly", values=("apples", "oranges", "bananas"))
chooser.set("apples")
chooser.pack(padx=40, pady=40)
app.mainloop()

वास्तव में क्या हो रहा है

clam थीम में, जब विजेट readonly और focus अवस्था में होता है, तो foreground का डिफ़ॉल्ट रंग सफेद होता है। यदि fieldbackground भी सफेद है, तो टेक्स्ट उसी पृष्ठभूमि में प्रभावी रूप से गायब दिखता है। यही कारण है कि मान गायब सा लगता है।

स्टाइलिंग को ठीक करना

समाधान यह है कि संबंधित state के लिए foreground रंग को स्पष्ट रूप से किसी पढ़ने योग्य रंग पर मैप किया जाए। Combobox के readonly और focus में होने पर foreground को काला सेट करने से दृश्यता वापस आ जाती है।

import tkinter as tk, tkinter.ttk as ttk
app = tk.Tk()
styler = ttk.Style(app)
styler.theme_use("clam")
styler.configure("TCombobox", fieldbackground="white", background="white")
styler.map(
    "TCombobox",
    fieldbackground=[("readonly", "white")],
    background=[("readonly", "white")],
    foreground=[("readonly", "focus", "black")]
)
chooser = ttk.Combobox(app, state="readonly", values=("apples", "oranges", "bananas"))
chooser.set("apples")
chooser.pack(padx=40, pady=40)
app.mainloop()

अगर आप चाहें, तो focus की परवाह किए बिना भी readonly के लिए foreground सेट कर सकते हैं।

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

UI थीम्स समझदारी भरे डिफ़ॉल्ट देती हैं, लेकिन कस्टमाइज़ेशन कभी-कभी उन डिफ़ॉल्ट्स से सूक्ष्म रूप से टकरा जाते हैं। यहां, पृष्ठभूमि का साधारण बदलाव थीम द्वारा परिभाषित state mapping के कारण टेक्स्ट को ढक देता है। ttk.Style.map कैसे काम करता है और readonly व focus जैसे states कैसे परस्पर क्रिया करते हैं—यह समझ होने से विजुअल रिग्रेशन से बचा जा सकता है और अलग-अलग इंटरैक्शन अवस्थाओं में विजेट पढ़ने योग्य बना रहता है।

मुख्य बातें

जब आप ttk विजेट्स पर fieldbackground या अन्य दृश्य गुणों को ओवरराइड करते हैं, तो उनसे जुड़े foreground mappings भी जांचें—खासकर उन states के लिए जिन्हें आपकी थीम उपयोग करती है। foreground के लिए छोटी, स्पष्ट state map लगातार पठनीयता सुनिश्चित करती है और clam थीम में ttk.Combobox पर “गायब” होता चयन जैसी आश्चर्यों से बचाती है।

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