Python 如何删除由循环生成的按钮

Python 如何删除由循环生成的按钮,python,tkinter,Python,Tkinter,如果按钮未分配给变量,我如何在单击按钮时删除它?lambda是您的朋友 在处理循环时,您有两个主要选择。这两个选项都使用lambda在这样的循环中维护每个按钮的值 一种是让按钮自行销毁: from tkinter import * class Main: def __init__(self, root): for i in range(0, 9): for k in range(0, 9): Button

如果按钮未分配给变量,我如何在单击按钮时删除它?

lambda
是您的朋友

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

一种是让按钮自行销毁:

  from tkinter import *


class Main:

    def __init__(self, root):

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


        root.mainloop()


root = Tk()

x = Main(root)
或者使用计数器和列表。我更喜欢这个列表方法,因为如果需要的话,我们可以用这样的列表做很多事情

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()
问题:如果按钮未分配给变量,单击该按钮时如何删除该按钮

核心点

  • .bind(“”,self.on_单击)
使用事件回调,为您提供
网格
坐标,以将删除的
按钮
替换为其他小部件,如带有图像的
标签

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()
将tkinter作为tk导入
类按钮(tk.按钮):
定义初始值(自、父、**kwargs):
super()。\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.bind(“”,self.on_单击)
单击时的def(自身,事件):
w=事件.widget
行,列=w.grid\u info().get('row'),w.grid\u info().get('column'))
打印('coord:{}'。格式((行、列)))
w、 销毁
类应用程序(tk.tk):
定义初始化(自):
super()。\uuuu init\uuuuu()
对于范围(0,9)中的行:
对于范围(0,9)中的列:
按钮(self,text=”“).grid(行=行,列=列)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
App().mainloop()

是否需要删除所有按钮?如果没有,您将如何决定是否需要删除某个按钮?请检查此问题,此网站上有许多与使用循环中创建的按钮相关的问题可能会有所帮助。问之前你做过什么调查吗?这是一个很常见的问题。这能回答你的问题吗?
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()