2016-12-02 1 views
-1

Я довольно новичок в python и tkinter. Я работаю с python 2.7 и tkinter 8.5.Tkinter bind не работает при передаче root.destroy напрямую

Я пытаюсь выйти мое приложение при нажатии на клавишу побег, и я столкнулся с каким-то странным поведением:

Когда я прохожу root.destoy в качестве аргумента для связывания(), приложение не делает ничего:

root = Tk() 
... 
root.bind('<Escape>', root.destroy) 

Но если определить функцию, которая вызывает root.destroy() и передать в качестве аргумента для связывания, все работает, как ожидалось:

def exit_app(): 
    root.destroy() 
root.bind('<Escape>', exit_app) 

Это также работает, если я прохожу лямбда как это:

root.bind('<Escape>', lambda f: root.destroy()) 

Может ли кто-нибудь объяснить, что здесь происходит?

Благодаря

+0

Мне очень сложно поверить, что он работает с 'exit_app'. Это должно дать ту же ошибку, что и при непосредственном связывании с root.destroy. –

+0

@furas жаль, что опечатка существует только в этом посте (я не копировал и не вставлял, это просто упрощенный пример). Редактирование сообщения прямо сейчас. Спасибо –

+0

@BryanOakley Почему вам трудно поверить? Он работает на моей машине –

ответ

1

При связывании команды к событию, что команда передается аргумент, который является объектом, который представляет собой событие. root.destroy не принимает никаких аргументов, поэтому вместо запуска выполняется ошибка.

Именно поэтому ваша лямбда работает: ваша лямбда принимает аргумент (как ни странно, по имени f).

Вы утверждаете в своем вопросе, что он работает с этим точным определением функции:

def exit_app(): 
    root.destroy() 

Я считаю, что невозможно поверить, по той же причине, описанной выше.

+0

Простите, вы правы. В моем реальном коде я вызвал обработчик кнопки с подписями «def btn_click (* args):» и вызовет root.destroy() внутри него. Извините за беспорядок, я не думал, что это важно. Спасибо за ваш быстрый ответ. –

+0

@AwerMuller: если бы вы потратили время на создание [минимального, полного и проверяемого примера] (http://stackoverflow.com/help/mcve), вы, вероятно, узнали бы сами по себе, что аргумент был критическим компонентом. Вот почему мы просим MCVE - часто усилия по ее созданию выставляют проблему без необходимости задавать здесь вопрос. По крайней мере, это позволило бы вам написать лучший вопрос. –

Смежные вопросы