Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 23, 2016 16:20:38

Straik32423
От: Ростов-на-Дону, Россия
Зарегистрирован: 2016-05-18
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter. Задать действие кнопке

Допустим я создал кнопку, которая вызывает функцию.

  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))
Теперь, при нажатии на кнопку, не происходит ничего. А если вернуть в изначальный вид, где в функцию ничего не передается, то все работает правильно. Как это исправить?

Отредактировано Straik32423 (Авг. 23, 2016 16:23:48)

Офлайн

#2 Авг. 23, 2016 16:56:09

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

tkinter. Задать действие кнопке

Классическая ошибка. Нужно понять, что такое объект функция и объект результата функции.

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

 def create_widgets(self, master):
        """Создает интерфейс"""
        self.btt1 = Button(master,text = "Покормить",command = lambda: self.feed(master))

Офлайн

#3 Авг. 23, 2016 17:17:32

Straik32423
От: Ростов-на-Дону, Россия
Зарегистрирован: 2016-05-18
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter. Задать действие кнопке

Благодарю.

4kpt_IV
Нужно понять, что такое объект функция и объект результата функции.
А как понять? Где можно об этом почитать? (Желательно, на русском)

Офлайн

#4 Авг. 23, 2016 19:01:21

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

tkinter. Задать действие кнопке

Эммм. Попытаюсь простыми словами.

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

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

Офлайн

#5 Авг. 23, 2016 21:50:32

Straik32423
От: Ростов-на-Дону, Россия
Зарегистрирован: 2016-05-18
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter. Задать действие кнопке

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

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

Надеюсь, я понятно сформулировал.

Офлайн

#6 Авг. 23, 2016 22:20:21

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

tkinter. Задать действие кнопке

Да это общее понятия. Если я не ошибаюсь, то в старой книге по tkiner, но она на инглише. Ну и это общие знания языка. Ну и еще. Чаще всего лямбду не используют. БОльшая часть информации, которая Вам нужна закопана в event при использовании bind…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version