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

Спасибо так много - ответ был ясен и вещий. – xxmbabanexx

Смежные вопросы