भले ही एक मेनलूप कहा जा रहा हो, मेरी tk विंडो दिखाई नहीं देगी। कोड काम करता था लेकिन जैसे ही मैंने अंक वर्ग में दूसरे फ़ंक्शन में कोड किया, वहां कोई टी विंडो नहीं है। मैं चाहूंगा कि कोई व्यक्ति केवल उत्तर देने के बजाय गलती को इंगित करे। क्या कोई कृपया मुझे इस समस्या को ठीक करने में मदद कर सकता है? मैं पायथन आईडीएलई 3.8 का उपयोग करता हूं इमेज: [1]: https://i.stack.imgur.com/o65WI.png< /ए> कोड:

from tkinter import *
from random import randint
import time
#number assignments
class nums:
    def __init__(self):
        self.value=randint(1,100)
    def assignnewnums(oldnum1,oldnum2,lbltxt,lbl,answer):
        getans = answer.get()
        if(getans==str((oldnum1.value+oldnum2.value))):
           del(oldnum1)
           del(oldnum2)
           oldnum1=nums()
           oldnum2=nums()
           lbltxt="Correct!"
           lbl.config(text=lbltxt)
           time.sleep(5)
           lbltxt="What is {} + {}".format(oldnum2.value,oldnum1.value)
           lbl.config(text=lbltxt)
        else:
            lbltxt="Wrong! Try Again!"
            lbl.config(text=lbltxt)
            time.sleep(3)
            lbltxt="What is {} + {}".format(oldnum2.value,oldnum1.value)
            lbl.config(text=lbltxt)
a = nums()
b = nums()
#GUI startup
root = Tk()
#Label
title = Label(root, text="AddPrac", fg="dark blue")
title.pack()
#Question
questxt = "What is {} + {}".format(a.value,b.value)
ques = Label(root,text=questxt,fg="red")
ques.pack()
#UserAnswer
ans = Entry(root)
ans.pack()
#SubmitButton
enter = Button(root,text="Submit Answer!",fg="yellow",command=nums.assignnewnums(a,b,questxt,ques,ans))
enter.pack()
#GUI continued startup
root.mainloop()
0
Confused_boy 21 जिंदा 2020, 01:21

1 उत्तर

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

मैंने आपके कोड की कोशिश की और यदि आप कुछ सेकंड प्रतीक्षा करते हैं तो विंडो दिखाई देती है। यह निम्नलिखित आपत्तिजनक कोड स्निपेट के कारण है:

command=nums.assignnewnums(a,b,questxt,ques,ans)

यह वह नहीं करता जो आपको लगता है कि यह करता है। आप सोच रहे थे:

command=lambda: nums.assignnewnums(a, b, questxt, ques, ans)

जिस तरह से आपका कोड अब लिखा गया है, यह बटन पर कॉलबैक को बाध्य नहीं करता है, बल्कि कॉल करता है- और फ़ंक्शन निष्पादित करता है (चूंकि आप इसे स्पष्ट रूप से लागू कर रहे हैं), और वापसी मूल्य को कॉलबैक के रूप में बांधने का प्रयास करता है, जो समझ। फ़ंक्शन को कॉल करने के एक साइड इफेक्ट के रूप में, मुख्य थ्रेड सो जाता है (चूंकि assignnewnums time.sleep का उपयोग करता है) इससे पहले कि आप root.mainloop तक पहुंचें।

जब भी आप किसी बटन पर कॉलबैक बाध्य कर रहे हों, तो आप कॉल करने योग्य ऑब्जेक्ट प्रदान करना चाहते हैं - या तो केवल एक फ़ंक्शन ऑब्जेक्ट, या यदि तर्क महत्वपूर्ण हैं, तो लैम्ब्डा या functools.partial

1
Paul M. 20 जिंदा 2020, 22:32