2013-01-17 55 views
0

我正在用Tkinter在Python 2.7.3中製作圖形計算器。我已經設置好了,所以當用戶按下'b'按鈕時,它會將'b'打印到控制檯。我通過創建一個函數來傳遞一個名爲'key'的變量,然後將它添加到標籤中。但是,當我第一次啓動程序時,它會自動調用該函數並將「b」打印到控制檯。每當我點擊按鈕,它什麼都不做。這裏是我的代碼:Tkinter中的Python計算器 - 函數自動運行

from Tkinter import * 

class Application(Frame): 
    def addkey(self,key): 
     print str(key) 

    def removekey(self): 
     if len(self.displaytext) > 0: 
      self.displaytext = self.displaytext[0:-1] 

    def createWidgets(self): 
     self.maxlength = 20 
     self.displaytext = "" 

     self.frame1 = Frame(self) 
     self.display = Label(self.frame1,textvariable=self.displaytext,width=self.maxlength+3,bg="black",fg="white",height=2) 
     self.frame1.pack() 
     self.display.pack() 

     self.frame2 = Frame(self) 
     self.bksp = Button(self.frame2,text="b",width=4,height=2,command=self.addkey("b")) 
     self.frame2.pack() 
     self.bksp.pack() 


    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.pack() 
     self.createWidgets() 

app = Application() 
app.mainloop() 

try: 
    root.destroy() 
except: 
    pass 
+0

它看起來像人們喜歡重複這個問題,其他人喜歡重複的答案:/ – mmgp

+0

@mmgp - 我相信我已經回答了好幾次。但是,提出搜索條件會讓你得到一個適當的已經回答的問題是相當困難的。有時候,回答這個問題要比尋找重複更容易 - 這就是說,如果您發現重複的投票結束或發佈鏈接,我會很樂意投票結束這個問題:)。 – mgilson

回答

1

要調用self.addkey並指派其結果給command說法。相反,你需要傳遞一個可以調用的函數。

換句話說,改變

command=self.addkey("b") 

command=lambda: self.addkey("b") 

如果self.addkey並不需要任何額外的參數,你可以只是做command=self.addkey,但因爲這是不是你需要的情況下lambda

2

command = ...期望通過函數(它接受0個參數)。實際上,您正在傳遞函數的結果(在這種情況下爲None)。

一個簡單的方法來做到這一點是使用anonymous function環繞的功能,並適當地調用它:

command=lambda: self.addkey("b") 

或者你可以做更多的冗長:

def button_func(): 
    return self.addkey("b") 
self.bksp = Button(self.frame2,text="b",width=4,height=2,command=button_func) 

但這種啓動如果你有15個按鈕,每個調用相同的底層函數,參數略有不同,那麼就會得到相當詳細的結果。