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()

問題は、答えが正しければ方程式が更新されないことです。したがって、質問が8 + 4のときに12を入力すると、正しいと言えますが、8 + 4を維持し、新しい方程式に変更したいと思います。

4

1 に答える 1

1

オブジェクトがインスタンス化さnew_problemれたときにのみ呼び出しています。Ed後で再度呼び出されることはありません。また、インスタンス化時にウィジェットのラベルを1回だけ作成するため、既存の設定が実際に変更されることはありません。

あなたがする必要があるのは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 に答える