Python tkinter,制作一个随机生成题目的测验,提交后重置
我遇到的问题是,我想用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()
1 个回答
1
你不应该在你的应用程序类外面使用 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
。只需这样做:
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 正常工作的方式来组织代码。可以看看一些示例,特别是 这个,了解如何组织你的代码。多探索一下那个网站,你应该能感受到 Tkinter 的氛围。