Виджет как аргумент опции команды виджета

Я хочу деактивировать кнопку, когда пользователь нажимает на нее. Поскольку я делаю много кнопок в графическом интерфейсе. Я хочу обобщить это. Я делаю это так:

      def deactivate (btn):
   btn.configure(state='disabled')
   print ('Button is deactivated')
   return

Button = Tk.Button(root, text='click',command=lambda: deactivate (Button))

Приведенный выше код у меня работает нормально, но я нигде не видел, чтобы кто-нибудь его использовал. Итак, мне интересно, есть ли в будущем осложнения, о которых я не знаю?

1 ответ

Решение

Ваша реализация в порядке. Но, как вы сказали, будет много кнопок с такой же функцией, тогда я бы предложил создать собственный класс Button (унаследованный от ), чтобы встроить эту функцию и использовать этот настраиваемый класс Button для тех кнопок, для которых требуется эта функция.

Ниже приведен пример:

      import tkinter as tk

class MyButton(tk.Button):
    def __init__(self, parent=None, *args, **kw):
        self._user_command = kw.pop("command", None)
        super().__init__(parent, *args, **kw)
        self["command"] = self._on_click

    def _on_click(self):
        self.configure(state="disabled")
        if self._user_command:
            self._user_command(self)

def on_click(btn):
   print (f'Button "{btn["text"]}" is deactivated')

root = tk.Tk()

button1 = MyButton(root, text='click', command=on_click)
button1.pack()

button2 = MyButton(root, text='Hello', command=on_click)
button2.pack()

root.mainloop()

Обратите внимание, что я изменил подпись обратного вызова для вариант. Экземпляр кнопки будет передан обратному вызову в качестве первого аргумента, чтобы вы могли делать с кнопкой все, что захотите.

Другие вопросы по тегам