0

我们必须为小学生做一个测试,以测试他们的数学技能。我需要左边的标签有一个随机方程,右边有一个输入表格,最右边有一个按钮来检查他们给出的答案是否正确。如果他们做对了,就会给出一个新的等式。

from tkinter import Label, Frame, Entry, Button, LEFT, RIGHT, END, TOP, END
from tkinter.messagebox import showinfo
from random import randrange

class Ed(Frame):
    'Simple arithmetic education app'
    def __init__(self,parent=None):
        'constructor'
        Frame.__init__(self, parent)
        self.pack()
        Ed.new_problem(self)
        Ed.make_widgets(self)
        self.tries = 0

    def make_widgets(self):
        'defines Ed widgets'
        if self.plusminus == 1: 
            Label(self, text=(self.a ,"+" ,self.b)).pack(side=LEFT)
        else:
            Label(self, text=(self.a, "-" ,self.b)).pack(side=LEFT)       
        self.ent = Entry(self)
        self.ent.pack(side=LEFT)        
        Button(self, text='Enter', command=self.evaluate).pack(side=RIGHT)

    def new_problem(self):
        'creates new arithmetic problem'
        self.a = randrange(1,10,1)
        self.b = randrange(1,10,1)
        self.c = randrange(1,10,1)
        if self.c < 5:
            self.total = self.a + self.b
            self.plusminus = 1     #plusminus = plus
        else:
            self.total = self.a - self.b
            self.plusminus = 0     #plusminus = minus

    def evaluate(self):
        'handles button "Enter" clicks by comparing answer in entry to correct result'
        if self.total == eval(self.ent.get()):
            showinfo(title='YAY', message='You are CORRECT!')
            self.ent.delete(0,END)
        else:
            self.ent.delete(0,END)
            self.ent.insert(END, 'Wrong. Try again.')
            self.tries+=1


Ed().mainloop()

问题是当答案正确时等式不会更新。所以当我输入 12 时,问题是 8 + 4。它是正确的,但保持 8 + 4,但我希望它改变为一个新的方程。

4

1 回答 1

1

您仅new_problemEd实例化对象时才调用。之后再也不会调用它,这样做实际上不会更改现有设置,因为您只需为您的小部件创建一次标签,也在实例化时。

您需要做的是将 a 传递tkinter.StringVar给您的Label小部件,然后set对该变量进行算术问题。new_problem然后,您在每个成功的答案之后运行。

我已经稍微更新了您的代码以super直接在实例上而不是通过类使用和运行方法,但这应该可以工作:

from tkinter import Label, Frame, Entry, Button, LEFT, RIGHT, END, TOP, END, StringVar
from tkinter.messagebox import showinfo
from random import randrange

class Ed(Frame):
    """Simple arithmetic education app"""
    def __init__(self,parent=None):
        """constructor"""
        super().__init__(parent)
        self.tries = 0
        self.problem = StringVar()
        self.make_widgets()
        self.new_problem()
        self.pack()

    def make_widgets(self):
        """defines Ed widgets"""
        self.label = Label(self, textvariable=self.problem)
        self.label.pack(side=LEFT)
        self.ent = Entry(self)
        self.ent.pack(side=LEFT)
        Button(self, text='Enter', command=self.evaluate).pack(side=RIGHT)

    def new_problem(self):
        """creates new arithmetic problem"""
        self.tries = 0
        self.a = randrange(1,10,1)
        self.b = randrange(1,10,1)
        if randrange(1,10,1) < 5:
            self.total = self.a + self.b
            self.plusminus = '+'
        else:
            self.total = self.a - self.b
            self.plusminus = '-'
        self.problem.set( (self.a , self.plusminus, self.b) )

    def evaluate(self):
        """handles button "Enter" clicks by comparing answer in entry to correct result"""
        if self.total == int(self.ent.get()):
            showinfo(title='YAY', message='You are CORRECT!')
            self.ent.delete(0,END)
            self.new_problem()
        else:
            self.ent.delete(0,END)
            self.ent.insert(END, 'Wrong. Try again.')
            self.tries += 1

Ed().mainloop()

我还把你改成evalint……你真的不想那样做,因为它使用户能够将 python 代码注入你的应用程序。

例如,我可以输入以下内容作为我的“答案”:

showinfo(title="Blah", message="Look ma - No hands!")

这只会显示一个简单的消息框,但大门敞开着,可以进行更多的恶作剧。

于 2012-10-08T06:11:58.280 回答