2015-08-28 229 views
0

我想在我的程序中运行一个while循环,但是当while循环就位时,代码停止,并且tkinter窗口无法打开。我该如何解决这个问题?应该这样,代码写出两个随机数,然后当输入正确的答案时,它应该重新循环。Python:由于while循环导致的Tkinter停止

from tkinter import * 
import random 

root = Tk() 

#Frames 
topFrame = Frame(root) # I want an invisible container in root 
topFrame.pack() 
bottomFrame = Frame(root) # I want an invisible container in root 
bottomFrame.pack(side=BOTTOM) 
#End Of Frames 

#Addition Question Maker 



AnswerBox = Entry(topFrame) 
AnswerBox.grid(row=0,column=4) 
EqualsSign = Label(topFrame, text="=").grid(row=0,column=3) 
AdditionSign = Label(topFrame, text="+").grid(row=0,column=1) 

NewQuestion = True 

while NewQuestion == True: 
    AdditionQuestionLeftSide = random.randint(0, 10) 
    AdditionQuestionRightSide = random.randint(0, 10) 
    global Total 
    Total = AdditionQuestionLeftSide + AdditionQuestionRightSide 
    AdditionQuestionRightSide = Label(topFrame, text= AdditionQuestionRightSide).grid(row=0,column=0) 
    AdditionQuestionLeftSide= Label(topFrame, text= AdditionQuestionLeftSide).grid(row=0,column=2) 
    answer = None 


def OutputAnswerText(event): 
    global answer 
    answer = AnswerBox.get() 
    if Total == int(answer): 
     Correct = Label(topFrame, text="Correct").grid(row=2,column=3) 
     NewQuestion = True 
    else: 
     Correct = Label(topFrame, text="Wrong").grid(row=2,column=3) 

AnswerBox.bind('<Return>', OutputAnswerText) 

root.mainloop() 

回答

-1

你有一个无限循环:

while NewQuestion == True: 

没有地方NewQuestion可以成为假(和在循环中没有休息)。所以循环是无限的。

另外:

EqualsSign = Label(topFrame, text="=").grid(row=0,column=3) 

不起作用,因为grid回报None。如果你想保持到窗口小部件的引用,您必须使用两行版本像:

AnswerBox = Entry(topFrame) 
AnswerBox.grid(row=0,column=4) 
0

使while循环相反的,我建议作出NewQuestion功能。该函数最初被调用,然后如果答案正确,该函数会再次被调用。这里是我的函数代码,以及一个自动输入删除选项,以消除在输入正确答案后退格您的答案的需要。

from tkinter import * 
import random 

root = Tk() 

#Frames 
topFrame = Frame(root) # I want an invisible container in root 
topFrame.pack() 
bottomFrame = Frame(root) # I want an invisible container in root 
bottomFrame.pack(side=BOTTOM) 
#End Of Frames 

#Addition Question Maker 



AnswerBox = Entry(topFrame) 
AnswerBox.grid(row=0,column=4) 
EqualsSign = Label(topFrame, text="=").grid(row=0,column=3) 
AdditionSign = Label(topFrame, text="+").grid(row=0,column=1) 


def NewQuestion(): 
    AdditionQuestionLeftSide = random.randint(0, 10) 
    AdditionQuestionRightSide = random.randint(0, 10) 
    global Total 
    Total = AdditionQuestionLeftSide + AdditionQuestionRightSide 
    AdditionQuestionRightSide = Label(topFrame, text= AdditionQuestionRightSide).grid(row=0,column=0) 
    AdditionQuestionLeftSide= Label(topFrame, text= AdditionQuestionLeftSide).grid(row=0,column=2) 
    answer = None 
    return 

NewQuestion() 

def OutputAnswerText(event): 
    global answer 
    global AnswerBox 
    answer = AnswerBox.get() 
    if Total == int(answer): 
     Correct = Label(topFrame, text="Correct").grid(row=2,column=3) 
     AnswerBox.delete(0, END) 
     NewQuestion() 
    else: 
     Correct = Label(topFrame, text="Wrong").grid(row=2,column=3) 

AnswerBox.bind('<Return>', OutputAnswerText) 

root.mainloop()