2012-10-22 67 views
3

這是我的代碼:如何在Python中使用TKinter在計算器中顯示數字?

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」,而不是相應的數字。請幫助。我還沒有開始研究如何使它達到實際的數學水平,但如果你也可以幫忙,那太棒了!

回答

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中,函數只是另一個對象。 Button類的command參數將一個函數(或任何其他類似類的可調用事物)當作按鈕被按下時調用的參數。 lambda關鍵字創建一個匿名函數,我們傳遞給該類。上面定義的顯示方法是模擬這樣的:

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期間被查找 - 意味着在這種情況下它將始終保持最後一個值。我們需要爲該值創建一個closure,我們在appear函數中執行此操作。

+1

嘿,很好。我想我只是要刪除我的答案,因爲當我修復它時,它看起來*非常類似於你的答案。 –

+0

@DianaMC,「追加」是一個錯字。前面的插入是由於'0'作爲插入的第一個參數,我從你的出現函數中複製了這個函數而沒有考慮它......將它改爲Tkinter常量END以追加到條目的末尾。 – l4mpi

+0

好的,有效。謝謝! –

相關問題