我的问题是我正在尝试在tkinter中进行数学测验,要求输入名称,然后使用randint函数选择一个问题。此人输入答案,单击提交,应用程序会回答是对还是错。
出现问题的原因在于,我希望程序在提交之后清除问题和答案并提出新的3次(每次添加到最后显示的分数),但是我似乎找不到轻松做到这一点的方法;我目前正在尝试一个while循环,但它无法正常工作。
所以我的问题是,如何每次在问一个不同的问题时,将代码循环的这一部分重复3次?
到目前为止我的代码:
from tkinter import*;from random import randint
class Tk_app(Frame):
def __init__(self, root):
super(Tk_app, self).__init__(root);self.grid();self.createElements()
def nameElements(self):
self.NmLbl = Label(self, text="Name:").grid(row=0)
self.Name = Entry(self);self.Name.grid(row=0, column=1);self.score = int(0)
def createElements(self):
Frame.grid_forget(self)
self.QNum = randint(1, 2)
self.QEnt = Entry(self);self.QEnt.grid(row=1, column=1)
if(self.QNum == 1):
self.QLbl = Label(self, text="What is the air speed velocity of a flying swallow?").grid(row=1)
self.a = "African or European?"
elif(self.QNum == 2):
self.QLbl = Label(self, text="What is your quest?").grid(row=1)
self.a = "To find the holy grail."
else:
self.QLbl = Label(self, text="What is your favourite colour?").grid(row=1)
self.a = "Green"
def submit(self):
FinNam = self.Name.get()
Ans = self.QEnt.get()
if(Ans == self.a):
AnsLbl = Label(self, text = "Well done you got it right, "+FinNam).grid(row=2, column=1)
self.score+=1
else:
AnsLbl = Label(self, text = "Sorry not this time, "+FinNam+" The answer was " + self.a).grid(row=2, column=1)
self.SBut = Button(self, text="submit", command=lambda:submit(self)).grid(row=2)
root = Tk();root.title("Monty Questions")
app = Tk_app.nameElements(root)
fin = int(0)
while(fin<3):
fin+=1
app2 = Tk_app.createElements(root)
root.mainloop()
答案 0 :(得分:1)
您不希望在app类之外使用while循环。当程序运行时,它应该在用户与它交互之前调用root.mainloop()
,并保持这种状态直到它完成。这段代码的一般结构不正确。
在Tkinter中,我只会在类定义之外:
root = Tk()
root.title("Monty Questions")
app = Tk_app()
root.mainloop()
然后你在init
中设置了所有tk小部件和诸如此类的内容:
class Tk_app(Frame):
def __init__(self, root):
Frame.__init__(root);
self.grid();
self.createElements()
self.nameElements()
等
最后,如果您只是将submit()
定义为Tk_app
的成员函数而不是像您拥有的那样定义嵌套函数定义,则不需要使用lambda函数来传递self
1}}。只是做:
class Tk_app():
... __init__ and other things...
def createElements(self):
... some code ...
self.SBut = Button(self, text="submit", command=self.submit ).grid(row=2)
def submit(self, Event):
... submit code ...
Event
是必要的,因为submit
不仅会传递self
,因为所有成员函数都是,它也会传递触发其调用的事件。
这可能不会让你一路走来,但希望能够以一种允许Tkinter正常工作的方式帮助构建你的代码。查看示例,尤其是this one,以了解如何构建代码。探索该网站,您应该了解Tkinter的氛围。