【问题标题】:How to delete a button that is made by a loop如何删除由循环制作的按钮
【发布时间】:2020-02-12 19:43:20
【问题描述】:
  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)

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

【问题讨论】:

  • 您需要删除所有按钮吗?如果没有,你将如何决定是否需要删除某个按钮?
  • 检查这个问题,它可能会帮助stackoverflow.com/questions/47883821/…
  • 这个网站上有很多与使用循环创建的按钮有关的问题。问之前有没有做过调查?这是一个很常见的问题。
  • 这能回答你的问题吗? tkinter destroy button after click

标签: python tkinter


【解决方案1】:

lambda 是你的朋友。

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

一种是让按钮自行销毁:

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

或者使用计数器和列表。我更喜欢这种列表方法,因为如果需要,我们可以用这样的列表做很多事情。

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

【讨论】:

    【解决方案2】:

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

    核心点

    • .bind('<Button-1>', self.on_click)

    使用事件回调,为您提供Grid 坐标,以将已删除的Button 替换为其他小部件,例如带有图像的Label

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      相关资源
      最近更新 更多