单击时如何销毁循环中的特定按钮?

时间:2021-07-22 20:14:17

标签: python tkinter

我正在尝试创建一个 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()

2 个答案:

答案 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()

PEP 8 -- Style Guide for Python Code