2013-04-29 42 views
0

我正嘗試使用tkinter構建一個小數字鍵盤,以便能夠在純觸摸系統上輸入密碼。這是我到目前爲止有:從Tkinter的進口TTKtkinter中的小數字鍵盤

def main(): 
    root = tkinter.Tk() 
    numpad = NumPad(root) 
    root.mainloop() 


btn_list = [ 
'7', '8', '9', 
'4', '5', '6', 
'1', '2', '3', '0'] 


class NumPad(ttk.Frame): 
    def __init__(self, root): 
     ttk.Frame.__init__(self, root) 
     self.grid() 
     self.numpad_create() 

    def numpad_create(self): 
     r = 1 
     c = 0 
     for b in btn_list: 
      cmd= lambda: print(b) 
      self.b= ttk.Button(self, text=b,width=5,command=cmd).grid(row=r,column=c) 
      print(b) 
      c += 1 
      if c > 4: 
       c = 0 
       r += 1 

main() 

進口的Tkinter 如果我開始PROGRAMM,它打印的數字B向外殼,使這部作品。此外按鈕顯示爲希望。但是如果我點擊它們,我會始終將0作爲輸出到shell。我找不到我犯的錯誤,我認爲這可能與垃圾收集有關,但我不確定。

有人能幫助我嗎?這將是非常棒的!

謝謝!

回答

2

cmd,你的lambda,在lambda本身被聲明的時候沒有捕獲到b的值。 b的最終狀態爲0,這就是爲什麼所有按鈕最終都會打印b

+0

謝謝,完美的作品! – user2304540 2013-04-29 19:33:02

0

NumPad.numpad_create中的for循環遍歷每個按鈕編號並將它們存儲在self.b中。問題是每個數字都會覆蓋之前的值self.b,因此實際存儲的唯一值是0。 tkinter自動垃圾收集沒有實時參考的對象。將另一個屬性添加到NumPad這是一個列表,並將所有按鈕對象放入其中。

@thkang也是對的:我認爲有兩個單獨的錯誤。請注意,我沒有真正測試過這個。

2

你拉姆達應該這樣指定:

cmd= lambda b=b: print(b) 

這會的b當前值綁定在你的拉姆達命名b參數的默認值。如果沒有這種綁定,lambda將在按下時使用b的值,而不是在創建時的值。

就我個人而言,我發現在上下文中使用相同的變量令人困惑;我個人會這樣寫,這是功能相同,但更容易理解:

cmd= lambda button=b: print(button) 
+0

謝謝,解決了這個問題! – user2304540 2013-04-29 19:33:27