2013-07-20 69 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