मैं एक प्रश्नोत्तरी-प्रकार का कार्यक्रम बना रहा हूँ, जहाँ मैंने एक बोनस प्रश्न जोड़ा है, जो अन्य प्रश्नों से अलग है। यहां, आपको 8 बटन दिए गए हैं, और सवाल यह है:

सूची 'lst' से सभी तत्वों को पॉप करने के लिए दिए गए विकल्पों में से चार बटन का प्रयोग करें

बटन हैं:

["lst", "while", "for", "i", ":", "lst.pop()", "in", "range(lst)"]

मैं क्या करना चाहता हूं, प्रत्येक बटन को क्लिक करने के बाद अक्षम कर देता हूं, और 4 क्लिक के बाद सभी बटन अक्षम कर देता हूं।

मैं यह भी जानना चाहता था कि मैं कैसे जांच सकता हूं कि क्लिक सही क्रम में हैं या नहीं?

मैंने एक ऐसा फ़ंक्शन बनाया है जो इंडेक्स 'इंडेक्स' के साथ एक बटन को अक्षम करता है

def disable(buttons, index, word):
    buttons[index].config(state="disabled")

फिर मैंने एक लूप के ऊपर 8 बटन बनाए।

words=["lst", "while", "for", "i", ":", "lst.pop()", "in", "range(lst)"]
buttons = []
for index in range(8): 
    n = words[index]
    button = Button(root, text = n, command = lambda index = index, n = n: disable(buttons, index, n)).pack(side = 'left')
    buttons.append(button)

यह वह त्रुटि है जो दिखाई देती है:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.6/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "<ipython-input-163-f56fc3dd64da>", line 340, in <lambda>
    button = Button(root, text = n, command = lambda index = index, n = n: disable(buttons, index, n)).pack(side = 'left')
  File "<ipython-input-163-f56fc3dd64da>", line 353, in disable
    buttons[index].config(state="disabled")
AttributeError: 'NoneType' object has no attribute 'config'
1
SkullBlazer 11 नवम्बर 2019, 19:01

1 उत्तर

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

इसे बदलें:

for index in range(8):
    n = words[index]
    button = Button(root, text = n, command = lambda index = index, n = n: disable(buttons, index, n)).pack(side = 'left')
    buttons.append(button)

इसके लिए:

for index in range(8): 
    n = words[index]
    button = Button(root, text = n, command = lambda index = index, n = n: disable(buttons, index, n))
    button.pack(side = 'left')
    buttons.append(button)

आप जो समस्या देख रहे हैं, वह ज्यामिति प्रबंधक pack() का उपयोग करने के कारण उसी पंक्ति में है जिस पर आप बटन बनाते हैं। जैसा कि सभी ज्यामिति प्रबंधक None लौटते हैं, यदि आप बटन को संपादित करने का प्रयास करते हैं तो आपको वह त्रुटि मिलेगी।

उसने कहा कि यह शायद बेहतर होगा यदि आप इस तरह से लूप लिखते हैं:

# Use import as tk to avoid any chance of overwriting built in methods.
import tkinter as tk

root = tk.Tk()
words = ["lst", "while", "for", "i", ":", "lst.pop()", "in", "range(lst)"]
buttons = []

# Use the list to set index.
for ndex, word in enumerate(words):
    # Append the button object to the list directly
    buttons.append(tk.Button(root, text=words[ndex]))
    # Us the lambda to edit the button in the list from the lambda instead of a new function.
    # A useful trick is to use `-1` to reference the last index in a list.
    buttons[-1].config(command=lambda btn=buttons[-1]: btn.config(state="disabled"))
    buttons[-1].pack(side='left')

if __name__ == '__main__':
    root.mainloop()

जैसा कि मेरा मानना ​​है कि index एक अंतर्निहित विधि है।

1
Mike - SMT 11 नवम्बर 2019, 19:52