2013-07-20 70 views
3

我試圖給按鈕賦值,當它們被點擊時返回它們的值(更準確地說,它們會打印它)。唯一需要注意的是按鈕是使用for循環動態創建的。在Tkinter中動態創建函數和綁定按鈕

如何將id(和其他變量)分配給已使用for循環創建的按鈕?

示例代碼:

#Example program to illustrate my issue with dynamic buttons. 

from Tkinter import * 

class my_app(Frame): 
    """Basic Frame""" 
    def __init__(self, master): 
     """Init the Frame""" 
     Frame.__init__(self,master) 
     self.grid() 
     self.Create_Widgets() 

    def Create_Widgets(self): 

     for i in range(1, 11): #Start creating buttons 

      self.button_id = i #This is meant to be the ID. How can I "attach" or "bind" it to the button? 
      print self.button_id 

      self.newmessage = Button(self, #I want to bind the self.button_id to each button, so that it prints its number when clicked. 
            text = "Button ID: %d" % (self.button_id), 
            anchor = W, command = lambda: self.access(self.button_id))#Run the method 

      #Placing 
      self.newmessage.config(height = 3, width = 100) 
      self.newmessage.grid(column = 0, row = i, sticky = NW) 

    def access(self, b_id): #This is one of the areas where I need help. I want this to return the number of the button clicked. 
     self.b_id = b_id 
     print self.b_id #Print Button ID 

#Root Stuff 


root = Tk() 
root.title("Tkinter Dynamics") 
root.geometry("500x500") 
app = my_app(root) 

root.mainloop() 

回答

6

的問題是,你正在使用的self.button_id的最後一個值,當你調用命令一旦創建按鈕。你必須爲每個拉姆達局部變量的當前值與lambda i=i: do_something_with(i)綁定:

def Create_Widgets(self): 
    for i in range(1, 11): 
     self.newmessage = Button(self, text= "Button ID: %d" % i, anchor=W, 
           command = lambda i=i: self.access(i)) 
     self.newmessage.config(height = 3, width = 100) 
     self.newmessage.grid(column = 0, row = i, sticky = NW) 
+0

非常感謝你 - 答案是明確的和Python的。 – xxmbabanexx