如何删除循环产生的按钮

时间:2020-02-12 19:43:20

标签: python tkinter

watch(_ => props.initData, _ => initEditor(props))

如果未将按钮分配给变量,如何将其删除?

2 个答案:

答案 0 :(得分:0)

lambda是你的朋友。

处理循环时,您有2个主要选择。这两个选项都使用lambda来在这样的循环中保持每个按钮的值。

一种是让按钮自行销毁:

import tkinter as tk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        for i in range(10):
            for k in range(10):
                btn = tk.Button(self, text='  ')
                btn.config(command=lambda b=btn: b.destroy())
                btn.grid(row=i, column=k)


if __name__ == '__main__':
    App().mainloop()

或使用计数器和列表。我更喜欢这种列表方法,因为如果需要,我们可以用这样的列表做很多事情。

import tkinter as tk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.btn_list = []
        counter = 0
        for i in range(10):
            for k in range(10):
                self.btn_list.append(tk.Button(self, text='  '))
                self.btn_list[-1].config(command=lambda c=counter: self.destroy_btn(c))
                self.btn_list[-1].grid(row=i, column=k)
                counter += 1

    def destroy_btn(self, ndex):
        self.btn_list[ndex].destroy()


if __name__ == '__main__':
    App().mainloop()

答案 1 :(得分:0)

问题:如果未将按钮分配给变量,如何将其删除?

核心点

  • .bind('<Button-1>', self.on_click)

使用事件回调,为您提供Grid坐标,以用其他小部件(例如将Button替换为图像)替换移除的Label

import tkinter as tk


class Button(tk.Button):
    def __init__(self, parent, **kwargs):
        super().__init__(parent, **kwargs)
        self.bind('<Button-1>', self.on_click)

    def on_click(self, event):
        w = event.widget
        row, column = w.grid_info().get('row'), w.grid_info().get('column')
        print('coord:{}'.format((row, column)))
        w.destroy()


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

        for row in range(0, 9):
            for column in range(0, 9):
                Button(self, text=" ").grid(row=row, column=column)


if __name__ == '__main__':
    App().mainloop()