首页 > 解决方案 > 单击时如何销毁循环中的特定按钮?

问题描述

我正在尝试创建一个 10*10 的按钮板,单击该按钮时,单击的按钮将被破坏,并且只有那个按钮。但是,我不知道如何指定单击了哪个按钮。

from tkinter import *

root = Tk()
root.title("Board")
def buttonClick():
    button.destroy()


for i in range(10):
    for j in range(10):
        button = Button(root, text="", padx=20, pady=10, command=buttonClick)
        button.grid(row=i+1, column=j+1)

root.mainloop()

标签: pythontkinter

解决方案


您必须创建获取widget/button作为参数的函数并将其与destroy()

def buttonClick(widget):
    widget.destroy()

首先你必须创造Button没有command=

button = tk.Button(root, text="", padx=20, pady=10)

稍后您可以将其button用作command=.

button["command"] = lambda widget=button:buttonClick(widget) 

它需要用于lambda分配带参数的函数。

因为您在循环中创建了许多按钮,所以它还需要使用widget=buttonin来创建具有来自for eachlambda的值的唯一变量。如果您不使用它,那么所有命令都将使用对同一个(最后一个)按钮的引用——并且单击每个按钮只会破坏最后一个按钮。buttoncommand


完整的工作代码

import tkinter as tk  # PEP8: `import *` is not preferred

# --- functions ---

def buttonClick(widget):
    widget.destroy()

# --- main ---

root = tk.Tk()
root.title("Board")

for i in range(10):
    for j in range(10):
        button = tk.Button(root, text="x", padx=20, pady=10)
        button["command"] = lambda widget=button:buttonClick(widget)
        button.grid(row=i+1, column=j+1)

root.mainloop()

PEP 8——Python 代码风格指南


推荐阅读