Как удалить кнопку из цикла - PullRequest
0 голосов
/ 12 февраля 2020
  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 ]

0 голосов
/ 13 февраля 2020

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

Точка ядра :

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

0 голосов
/ 13 февраля 2020

lambda ваш друг.

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

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

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...