2015-12-07 2 views
2

Я пытаюсь создать кнопки, которые удаляют себя. В приведенном ниже коде я создаю несколько кнопок в цикле for, добавляю их в список и собираю их. Я могу удалить и удалить любую кнопку в определенной позиции индекса в списке кнопок, но вам нужно выяснить, как заставить каждую кнопку найти себя в списке кнопок.Создание кнопок, которые расположены в списке

from tkinter import * 
import random 

class App(Tk): 
    def __init__(self): 
     Tk.__init__(self) 

     self.totalButtons = random.randint(5, 25) 

     # The buttons will be stored in a list 
     self.buttons = [] 
     self.labels = [] 

     self.createButtons() 

    def createButtons(self): 
     for i in range(0, self.totalButtons): 
      # Here I create a button and append it to the buttons list 
      self.buttons.append(Button(self, text = i, command = self.removeButton)) 

      # Now I grid the last object created (the one we just created) 
      self.buttons[-1].grid(row = i + 1, column = 1) 

      # Same thing for the label 
      self.labels.append(Label(self, text = i)) 
      self.labels[-1].grid(row = i + 1, column = 0) 

    def removeButton(self): 
     # When a button is clicked, buttonIndex should be able to find the index position of that button in self.buttons 
     # For now I set it to 0, which will always remove the first (top) button 
     indexPosition = 0 

     # Takes the button (in this case, the first one) off the grid 
     self.buttons[indexPosition].grid_forget() 

     # Removes that button from self.buttons 
     del self.buttons[indexPosition] 

     # Same for the label 
     self.labels[indexPosition].grid_forget() 
     del self.labels[indexPosition] 


def main(): 
    a = App() 
    a.mainloop() 

if __name__ == "__main__": 
    main() 

Спасибо!

+0

Зачем вам хранить их в списке? – tzaman

+0

У меня была такая же проблема на днях, когда я пытался найти индекс кнопки в списке после ее нажатия. –

ответ

2
command = lambda idx=i: self.removeButton(idx) 

лямбда здесь принимает значение i из вашего диапазона и присваивает его idx и передач в функцию. Этот вызов функции теперь уникален для каждой кнопки, поэтому они имеют значение, соответствующее их индексу.

for i, btn in enumerate(self.buttons): 
    btn['command'] = lambda idx=i: self.removeButton(idx) 

Поскольку вы удаляете каждую кнопку из списка нужно присвоить новое значение параметра командной строки, чтобы правильно отразить, где новое положение существующих кнопок в списке.

def createButtons(self): 
     for i in range(0, self.totalButtons): 
      # Here I create a button and append it to the buttons list 
      self.buttons.append(Button(self, text = i, command = lambda idx=i: self.removeButton(idx))) 

      # Now I grid the last object created (the one we just created) 
      self.buttons[-1].grid(row = i + 1, column = 1) 

      # Same thing for the label 
      self.labels.append(Label(self, text = i)) 
      self.labels[-1].grid(row = i + 1, column = 0) 

    def removeButton(self, i): 
     # Takes the button at index i off the grid 
     self.buttons[i].grid_forget() 

     # Removes that button from self.buttons 
     del self.buttons[i] 

     # Same for the label 
     self.labels[i].grid_forget() 
     del self.labels[i] 

     # Assign new values for index position 
     for new_i, btn in enumerate(self.buttons): 
      btn['command'] = lambda idx=new_i: self.removeButton(idx) 
+0

Что такое idx? Могу ли я установить idx для любой переменной? – zbalda

+0

Это просто имя переменной, которое я использовал для представления индекса. Вы можете называть это тем, что хотите, даже «я». Я просто использовал другое имя, чтобы избежать путаницы –