मैं अपने टेक्स्ट बॉक्स और कम्बोबॉक्स बनाने के लिए लूप के लिए उपयोग कर रहा हूं। मुझे अपने टेक्स्ट बॉक्स (प्रविष्टि) में टेक्स्ट बदलने में सक्षम होना चाहिए, फिर combobox में आइटम्स को अपडेट करने के लिए फ़ंक्शन को कॉल करें। यहां वह कोड है जिसका मैं उपयोग कर रहा हूं।

def updatelist(updated_Num):
    ...
    ...
    new_list = [{'a':1},{'b':2},{'c':3}]

options = tk.StringVar(root)
for row, data in enumerate(all_data):
    entry = tk.Text(root, height=1.5, width=15)
    entry.bind('<Return>', lambda event: updateList(updated_Num=entry.get('1.0', 'end-1c')))
    entry.grid(row=row, column=1)

    options = [x for x in data[2]]
    variable.set(options[0])
    combobox = tk.ttk.Combobox(root, value=options, state='readonly')
    combobox.current(0)
    combobox.grid(row=row, column=2)

मेरी समस्या यह है कि यह हमेशा बनाए गए अंतिम प्रविष्टि बॉक्स से पाठ को पकड़ लेता है, और यह उस प्रविष्टि बॉक्स से पाठ को हटा देता है जिसे मैंने दर्ज किया था।

मैं उस विशिष्ट टेक्स्ट बॉक्स से टेक्स्ट कैसे प्राप्त करूं जिसमें मैंने डेटा दर्ज किया है, साथ ही उस पंक्ति में कम्बोबॉक्स के विकल्पों को अपडेट कैसे करें?

संपादित करें: यह अब ठीक उसी तरह काम कर रहा है जैसा मैं चाहता हूं। सहायता के लिए धन्यवाद!

def updatelist(updated_Num, row):
    ...
    ...
    new_list = [{'a':1},{'b':2},{'c':3}]

    options = tk.StringVar(root)
    options = [x for x in new_list]
    variable.set(options[0])
    combobox = tk.ttk.Combobox(root, value=options, state='readonly')
    combobox.current(0)
    combobox.grid(row=row, column=2)

options = tk.StringVar(root)
for row, data in enumerate(all_data):
    entry = tk.Text(root, height=1.5, width=15)
    entry.bind('<Return>', lambda event, entry=entry, row=row: updateList(updated_Num=entry.get('1.0', 'end-1c'), row=row))
    entry.grid(row=row, column=1)

    options = [x for x in data[2]]
    variable.set(options[0])
    combobox = tk.ttk.Combobox(root, value=options, state='readonly')
    combobox.current(0)
    combobox.grid(row=row, column=2)
1
BrianC 24 जिंदा 2021, 19:37

1 उत्तर

सबसे बढ़िया उत्तर

समस्या यह है कि आप for-लूप में lambda फ़ंक्शन कैसे बनाते हैं। यह entry के मान को बंद कर रहा है, जो लूप के अंत में बनाया गया अंतिम प्रविष्टि बॉक्स है। इसे ठीक करने का एक सामान्य तरीका लैम्ब्डा को एक डिफ़ॉल्ट तर्क देना है:

for row, data in enumerate(all_data):
    entry = tk.Text(root, height=1.5, width=15)
    entry.bind('<Return>', 
               lambda event, entry=entry: updateList(updated_Num=entry.get('1.0', 'end-1c')))
    entry.grid(row=row, column=1)

यह एक सामान्य समस्या है जिसे लोग लूप में tkinter विजेट बना रहे हैं, इसलिए आपका प्रश्न डुप्लिकेट के रूप में बंद हो सकता है।

1
martineau 24 जिंदा 2021, 19:53
धन्यवाद, इससे मेरे फ़ंक्शन के लिए सही जानकारी प्राप्त करने में मदद मिली, लेकिन मैं अभी भी यह नहीं समझ सकता कि मेरे कम्बोबॉक्स को नई सूची के साथ कैसे अपडेट किया जाए। इसके अलावा, आईडीके क्यों हर बार जब मैं एंटर दबाता हूं तो यह मेरे टाइप किए गए उत्तर को साफ़ कर देता है। मैं हमेशा वापस जा सकता हूं और इसे सम्मिलित कर सकता हूं क्योंकि मैं इसे अपने .get में प्राप्त कर रहा हूं, लेकिन इसे जोड़ना अच्छा नहीं होगा।
 – 
BrianC
24 जिंदा 2021, 20:05
आप कम्बोबॉक्स को अपडेट करने के लिए combobox.config(values=new_list) का उपयोग कर सकते हैं। दूसरे भाग के लिए, मुझे यकीन नहीं है, क्या आप फ़ंक्शन के अंदर मान हटा रहे हैं?
 – 
Cool Cloud
24 जिंदा 2021, 20:16
@BrianC: आपके प्रश्न में उन अन्य मुद्दों को ठीक करने का तरीका बताने के लिए पर्याप्त जानकारी नहीं है। एक समस्या यह हो सकती है कि new_list, updatelist() फ़ंक्शन में एक स्थानीय चर है। कृपया चलाने योग्य न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण प्रदान करें।
 – 
martineau
24 जिंदा 2021, 20:33
मैं अपने फ़ंक्शन के अंत में विकल्पों, चर, और कम्बोबॉक्स लाइनों को कॉपी/पेस्ट करने में सक्षम था, और फ़ंक्शन में पंक्ति भी पास करता था और अब यह काम कर रहा है। मुझे यह दिखाने के लिए धन्यवाद कि फ़ंक्शन में जानकारी कैसे पास करें!
 – 
BrianC
24 जिंदा 2021, 20:38
@BrianC: यह सुनकर अच्छा लगा ... आपका स्वागत है। केवल FYI करें, यदि आपको ईवेंट हैंडलर में केवल वह विजेट है जिसके कारण ईवेंट हुआ है, तो आप इसे event.widget से प्राप्त कर सकते हैं, इसलिए इसे अलग से पास करने की आवश्यकता नहीं होगी जैसा कि मेरे उत्तर में दिखाया गया है . एक अन्य उपयोगकर्ता ने इसका उल्लेख किया है, लेकिन तब से उन्होंने अपना उत्तर हटा दिया है (इसलिए आप इसे देखने में सक्षम नहीं हो सकते हैं)।
 – 
martineau
24 जिंदा 2021, 21:40