मैं अपने टेक्स्ट बॉक्स और कम्बोबॉक्स बनाने के लिए लूप के लिए उपयोग कर रहा हूं। मुझे अपने टेक्स्ट बॉक्स (प्रविष्टि) में टेक्स्ट बदलने में सक्षम होना चाहिए, फिर 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 उत्तर
समस्या यह है कि आप 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
विजेट बना रहे हैं, इसलिए आपका प्रश्न डुप्लिकेट के रूप में बंद हो सकता है।
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।
combobox.config(values=new_list)
का उपयोग कर सकते हैं। दूसरे भाग के लिए, मुझे यकीन नहीं है, क्या आप फ़ंक्शन के अंदर मान हटा रहे हैं?new_list
,updatelist()
फ़ंक्शन में एक स्थानीय चर है। कृपया चलाने योग्य न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण प्रदान करें।event.widget
से प्राप्त कर सकते हैं, इसलिए इसे अलग से पास करने की आवश्यकता नहीं होगी जैसा कि मेरे उत्तर में दिखाया गया है . एक अन्य उपयोगकर्ता ने इसका उल्लेख किया है, लेकिन तब से उन्होंने अपना उत्तर हटा दिया है (इसलिए आप इसे देखने में सक्षम नहीं हो सकते हैं)।