Как удалить кнопку из цикла

  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)

Как удалить кнопку, когда она нажата, если она не назначена переменной?

Всего 2 ответа


lambda твой друг.

При работе с петлями у вас есть 2 основных варианта. Оба варианта используют лямбду для поддержания значений для кнопки в цикле, как это.

Один из них - уничтожить кнопку:

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

Вопрос : Как удалить кнопку, когда она нажата, если она не назначена переменной?

Основная точка :

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


Есть идеи?

10000