python - 单击时如何销毁循环中的特定按钮?
问题描述
我正在尝试创建一个 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()
解决方案
您必须创建获取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=button
in来创建具有来自for eachlambda
的值的唯一变量。如果您不使用它,那么所有命令都将使用对同一个(最后一个)按钮的引用——并且单击每个按钮只会破坏最后一个按钮。button
command
完整的工作代码
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()
推荐阅读
- javascript - Vue.js:订阅和修改从父组件到子组件的所有事件
- windows - 无法激活 Windows 应用商店应用 - 应用未启动
- arrays - MongoDB:顶级数组条件
- azure - 如何在 Azure 中将 xml 数据转换为 csv/excel/table
- gitlab - 在 GitLab 中附加管道工件以发布
- html - 屏蔽返回数字的字段
- c# - 使用代码优先方法创建不是自动递增的主键
- mysql - Mysql select from mediumint(8) to unique Binary(2)
- c++ - 如何删除 std::function
在向量中? - memory-leaks - 解释数量惊人的计时器并找到它们的起源