Повторная привязка «выбрать все» в виджете «Ввод»

Мой вопрос связан с этим, где используется текстовый виджет.

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

Я попробовал следующее, что позволяет мне использовать Ctrl+w для выбора всего ввода в поле ввода:

self.frmSearch = Frame()
self.txtSearch = Entry(self.frmSearch, bd=1, width=35)
self.txtSearch.bind('<Control-w>',lambda e: self.txtSearch.select_range(0, END))

Однако, как только я изменил Ctrl+w на Ctrl+a, это больше не работает, и текст не выделяется. . У кого-нибудь есть объяснение, почему?


person orschiro    schedule 09.07.2012    source источник


Ответы (1)


Это связано с тем, что вы помещаете привязку к виджету, а не к классу виджета, и по умолчанию привязки к классу срабатывают после привязок к виджету.

Способ, которым Tkinter обрабатывает события, заключается в том, чтобы сначала увидеть, есть ли привязка к виджету, затем к классу, затем к окну верхнего уровня и, наконец, к специальному классу «все». События обрабатываются по порядку, если вы, так сказать, не разорвете цепочку событий. Итак, ваша привязка control-w происходит, но затем происходит привязка к классу и эффективно отменяет то, что вы сделали в своей привязке.

Лучшее решение состоит в том, чтобы 1) не использовать лямбда, а вместо этого использовать реальный метод или функцию и 2) выполнить «возврат 'break'», который предотвращает срабатывание класса и других привязок. Или, если вы хотите, чтобы эта привязка влияла на все виджеты ввода в вашем приложении, а не только на определенный, используйте bind_class, указав имя класса 'Entry'.

Вопрос, на который вы ссылаетесь в своем вопросе, имеет ответ, который дает пример изменения привязки класса.

person Bryan Oakley    schedule 09.07.2012