Python tkinter,使用随机生成的问题进行测验,每次提交后重置

时间:2014-11-03 19:55:27

标签: 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 个答案:

答案 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的氛围。