我正在尝试创建删除自己的按钮。在下面的代码中,我在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 :(得分:2)
command = lambda idx=i: self.removeButton(idx)
lambda这里从您的范围中取值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)