3

これは私のコードです:

from Tkinter import*

calculator = Tk()
calculator.title('Calcualtor')
calculator.geometry('300x325')

screen = Frame(calculator, bd=2, width=250, height=25, relief=SUNKEN)
buttons = Frame(calculator, bd=2, width=250, height=200)
screen.grid(column=0, row=0, padx=25, pady=25)
buttons.grid(column=0, row=1, padx=25)

def appear():
    results.insert(0, "0")
    return

numbers=["7", "4", "1", "8", "5", "2", "9", "6", "3"]
for index in range(9):
   Button(buttons, bg="White", text=numbers[index], width=5, height=2, command=appear).grid(padx=5, pady=5, row=index%3, column=index/3) 

zero= Button(buttons, bg="White", text="0", width=5, height=2)
zero.grid(padx=5, pady=5, column=1, row=3)

functions=["-", "+", "*", "/"]
for index in range(4):
    Button(buttons, bg="White", text=functions[index], width=5, height=2).grid(padx=5, pady=5, row=index%4, column=3) 

equals= Button(buttons, bg="White", text="=", width=5, height=2)
equals.grid(ipadx=10, pady=5, row=5, column=1)

numbers = StringVar()
results = Entry(screen, textvariable=numbers, width=30)
results.pack()

calculator.mainloop()

電卓は良さそうに見えますが、ボタンを押すと数値が表示されるようにするのに助けが必要です。私の関数でわかるように、現在、ボタンが押されるたびに、対応する番号ではなく「0」が表示されます。助けてください。実際の計算を行う方法を考え始めたわけではありませんが、それについても助けていただければ、それは素晴らしいことです!

4

1 に答える 1

3

ボタンに関連付けられた番号を返すクロージャーを作成する必要があります。appear関数を次のように変更します。

def appear(x):
    #return an anonymous function which appends x to the "result" textentry
    return lambda: results.insert(END, x)

次に、ボタンの定義を次のように変更します。

numbers = ["7", "4", "1", "8", "5", "2", "9", "6", "3"]
for index in range(9):
    n = numbers[index]
    Button(buttons, text=n, command=appear(n), ...).grid(...)

このようにして、各ボタンは正しい番号を追加する独自の機能を取得します。

Python では、関数は単なる別のオブジェクトです。クラスのcommand引数はButton、ボタンが押されたときに呼び出される引数として関数 (またはクラスのような他の呼び出し可能なもの) を取ります。lambdaキーワードは、クラスに渡す無名関数を作成します。上記で定義されたappearメソッドはこれに類似しています:

def appear(x):
    #create a new function that displays x in the text entry and return it
    def show_x():
        results.insert(END, x)
    return show_x

この場合、ラムダをインライン化することはできません。

#THIS DOESN'T WORK AS EXPECTED:
for index in range(9):
    n = numbers[index]
    f = lambda: results.insert(END, n)
    Button(..., command = f, ...)

nループの反復ごとに変化し、関数の実行中に検索されるローカル変数であるため、これは機能fしません。つまり、この場合、常に最後の値を保持します。関数で行う値のクロージャを作成する必要がありappearます。

于 2012-10-22T14:46:09.967 に答える