Python tkinter,制作一个随机生成题目的测验,提交后重置

0 投票
1 回答
1815 浏览
提问于 2025-05-01 09:31

我遇到的问题是,我想用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 的氛围。

撰写回答