Найти - Пользователи
Полная версия: tkinter. Задать действие кнопке
Начало » GUI » tkinter. Задать действие кнопке
1
Straik32423
Допустим я создал кнопку, которая вызывает функцию.
  def create_widgets(self, master):
        """Создает интерфейс"""
        self.btt1 = Button(master,text = "Покормить",command = self.feed)
Все было хорошо, пока я не решил, что в эту функцию нужно передать какой-то параметр.
  def create_widgets(self, master):
        """Создает интерфейс"""
        self.btt1 = Button(master,text = "Покормить",command = self.feed(master))
Теперь, при нажатии на кнопку, не происходит ничего. А если вернуть в изначальный вид, где в функцию ничего не передается, то все работает правильно. Как это исправить?
4kpt_IV
Классическая ошибка. Нужно понять, что такое объект функция и объект результата функции.

В Вашем случае можно использовать lambda

 def create_widgets(self, master):
        """Создает интерфейс"""
        self.btt1 = Button(master,text = "Покормить",command = lambda: self.feed(master))
Straik32423
Благодарю.
4kpt_IV
Нужно понять, что такое объект функция и объект результата функции.
А как понять? Где можно об этом почитать? (Желательно, на русском)
4kpt_IV
Эммм. Попытаюсь простыми словами.

 # Это функция
def call(c):
    return c
# Это ссылка на объект функции
a = call
# Т.е можно использовать как объект
print(a(12))
# А вот это уже объект результата
b = call(13)
# В результате b ссылается не на функцию, а на результат ее выполнения.

В Вашем случае вы хотели повесить в качестве обработчика события не функцию, а ее результат. Tkiner ожидает обработчика в виде callable объекта, а Ваша функция возвращает уж точно не другую функцию…

Straik32423
4kpt_IV
Эммм. Попытаюсь простыми словами.
Хорошо, спасибо, я понял.

Я имею в виду, что можно почитать, чтобы хотя бы примерно понимать, как это все устроено, чтобы больше не возникало подобных проблем? Просто нигде, где я читал информацию про tkinter, не было ничего сказано про lambda.

Надеюсь, я понятно сформулировал.
4kpt_IV
Да это общее понятия. Если я не ошибаюсь, то в старой книге по tkiner, но она на инглише. Ну и это общие знания языка. Ну и еще. Чаще всего лямбду не используют. БОльшая часть информации, которая Вам нужна закопана в event при использовании bind…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB