我正在尝试创建一个 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()
答案 0 :(得分:2)
这可以通过自定义类轻松实现:
.right {
display: flex;
justify-content: right;
}
.left {
display: flex;
justify-content: left;
}
因此自定义类只是将命令分配给 from tkinter import Button, Tk
root = Tk()
root.title("Board")
class Self_Destruct_Button(Button):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.configure(command=self.button_click)
def button_click(self):
self.destroy()
for i in range(10):
for j in range(10):
button = Self_Destruct_Button(root, text="", padx=20, pady=10)
button.grid(row=i + 1, column=j + 1)
root.mainloop()
方法,该方法会销毁按钮。
作为旁注,我还删除了通配符导入,因为这不是最佳做法。
告诉我这是否适合您
答案 1 :(得分:2)
您必须创建以 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
中使用 lambda
来为每个 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()