Окно tk не будет отображаться, даже если есть mainloop - PullRequest
0 голосов
/ 21 января 2020

Несмотря на то, что mainl oop вызывается, мое окно tk не появится. Код раньше работал, но как только я закодировал вторую функцию в классе nums, окна tk не было. Я хотел бы, чтобы кто-то указал на ошибку, а не просто раздал ответ. Может кто-нибудь помочь мне решить эту проблему? Я использую Python IDLE 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()

1 Ответ

1 голос
/ 21 января 2020

Я попробовал ваш код, и окно появится, если вы подождете несколько секунд. Это связано со следующим фрагментом кода:

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

Это не то, что вы думаете. Вы думали о:

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

То, как ваш код написан сейчас, не привязывает обратный вызов к кнопке, а скорее вызывает и выполняет функцию (поскольку вы вызываете ее явно), и пытается связать возвращаемое значение как обратный вызов, что не имеет смысла. В качестве побочного эффекта при вызове функции основной поток спит (поскольку assignnewnums использует time.sleep) на некоторое время, прежде чем вы достигнете root.mainloop.

Каждый раз, когда вы связываете обратный вызов с кнопкой, вы хотите предоставить вызываемый объект - либо просто функциональный объект, либо, если аргументы критичны, лямбда-выражение или functools.partial.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...