Уведомления

Группа в Telegram: @pythonsu

#1 Март 2, 2015 16:33:29

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Tkinter виджет Text "выбрать все"

Нет. Не один. Я для Вас обработчики повесил явно, чтобы было видно что за чем следует. Вызывается Ваш метод, а уж потом остальные методы в том числе и метод класса. В соответствии с методом класса canvas реагирует на ctrl-a переводом курсора в начало строки.

С Вашим примером получается так:
1. После выполнения вашего обработчика происходит выделение (“but”). Он выполняется первым.
2. Потом обрабатывается метод canvas “class” (переход курсора в начало строки) и выделение снимается.
3. Потом вызывается обработчик “root” - у Вас не назначен (никакой реакции GUI нет).
4. Потом вызывается обработчик “all” - у Вас также не назначен (соответственно тоже никакой реакции).

Отредактировано 4kpt_III (Март 2, 2015 16:35:16)

Офлайн

#2 Март 2, 2015 19:57:37

moskitos80
От: Luna
Зарегистрирован: 2015-01-28
Сообщения: 18
Репутация: +  0  -
Профиль  

Tkinter виджет Text "выбрать все"

4kpt_III
1. После выполнения вашего обработчика происходит выделение (“but”). Он выполняется первым.
2. Потом обрабатывается метод canvas “class” (переход курсора в начало строки) и выделение снимается.
3. Потом вызывается обработчик “root” - у Вас не назначен (никакой реакции GUI нет).
4. Потом вызывается обработчик “all” - у Вас также не назначен (соответственно тоже никакой реакции).
Уважаемый 4kpt_III спасибо вам большое, я наверно уже вынес вам мозг, но объясните пожалуйста. Почему вызываются обработчики по п.1-4 если я их явно не устанавливал? И не очень понятно про метод canvas “class” - ведь я работаю с виджетом Text.

Отредактировано moskitos80 (Март 2, 2015 20:03:00)

Офлайн

#3 Март 3, 2015 11:57:27

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Tkinter виджет Text "выбрать все"

Насчет canvas приношу свои извинения. Я просто отвечал на другой вопрос и поэтому наложилось. Да. Вы правы. Я имел ввиду виджет Text.

Теперь по вопросу. Все очевидно. Существуют обработчики по-умолчанию.

Вы же явно не прописываете, чтобы при нажатии на крестик в правом верхнем углу окна оно должно закрываться (можно использовать protocol для переопределения). Но система уже заранее знает, что при нажатии на крестик осуществляется .destroy(). Она сама повесила на это событие обработчик.

Другой пример. Когда Вы используете listbox, то при нажатии на элемент он становится активным, хотя Вы этого и не прописывали. Виджет не должен вообще никак реагировать. Система опять добавила к виджету обработчик по-умолчанию.

Делается это для упрощения процесса разработки. Иначе придется описывать очень и очень много событий (я когда-то задался целью построить свое меню и описывал события на основе label пытаясь реализовать поведение их в контексте настроек пользователя как полосу меню - их там просто тьма).

Все события по-умолчанию система лихо пихает в bind_class. Именно там они и хранятся. И выполняются уже после назначенных пользователем. Это сделано специально, чтобы можно было расширить возможности стандартных методов не переопределяя их.

P.S. Никаких проблем. Для этого форум и существует.

Офлайн

#4 Март 3, 2015 13:36:03

moskitos80
От: Luna
Зарегистрирован: 2015-01-28
Сообщения: 18
Репутация: +  0  -
Профиль  

Tkinter виджет Text "выбрать все"

Я понял: на распространенные события типа клик по “крестику” в правом верхнем углу окна и т.п. уже существуют обработчики событий. А скажите пожалуйста, есть ли какой нибудь способ определить сколько обработчиков, в том числе и встроенных по-умолчанию, прикреплены к тому или иному событию? Вот на пример на то же <Control-a> или какое другое? Т.е. есть ли способ провести какую нибудь интроспекцию в этом направлении?

Отредактировано moskitos80 (Март 3, 2015 13:37:15)

Офлайн

#5 Март 3, 2015 14:23:18

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Tkinter виджет Text "выбрать все"

Нужно копаться в документации ttk. Зачастую это не мешает, как в Вашем случае. Такие выпадения - одни на сотню. Явно можно глянуть методом .event_info(). Но только придется потом рекурсивно разбирать virtual events. Потому как именно в них упакованы события - реакции. Плюс под каждую систему есть свой набор событий в виртуальных сборках. Поэтому полную и исчерпывающую информацию - только в документации по ttk.

P.S. Если честно, то все же не понятно зачем Вам такая интроспекция.

P.S.S. Любые события системы на любом виджете, к слову, можно заглушить.

Офлайн

#6 Март 3, 2015 16:56:10

moskitos80
От: Luna
Зарегистрирован: 2015-01-28
Сообщения: 18
Репутация: +  0  -
Профиль  

Tkinter виджет Text "выбрать все"

Еще раз спасибо вам огромное.

4kpt_III
Любые события системы на любом виджете, к слову, можно заглушить.
попробую угадать:
widget.bind('<Control-c>', lambda: 'break')
вы это имели ввиду?

Офлайн

#7 Март 3, 2015 17:11:42

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Tkinter виджет Text "выбрать все"

Нет. Не это. Я же написал, что “break” это жуткий костыль и ненужный хак.

Вы можете управлять потоком “всплывания” событий. Можете управлять что будет следовать за чем.
Например, в вашем случае, Вы можете сделать так, чтобы сначала выполнялась ctrl-a для root, потом ctrl-a по-умолчанию (“class”) а уже потом Ваш обработчик.

Отредактировано 4kpt_III (Март 3, 2015 17:12:38)

Офлайн

#8 Март 3, 2015 21:02:48

moskitos80
От: Luna
Зарегистрирован: 2015-01-28
Сообщения: 18
Репутация: +  0  -
Профиль  

Tkinter виджет Text "выбрать все"

4kpt_III
Вы можете управлять потоком “всплывания” событий. Можете управлять что будет следовать за чем.
Например, в вашем случае, Вы можете сделать так, чтобы сначала выполнялась ctrl-a для root, потом ctrl-a по-умолчанию (“class”) а уже потом Ваш обработчик.
Уважаемый 4kpt_III, Вы не подкинете ссылку на документацию, которой пользуетесь по tkinter?

Офлайн

#9 Март 3, 2015 21:10:12

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Tkinter виджет Text "выбрать все"

Да не вопрос. 99,5% информации отсюда.

Можно даже в PDF вытянуть.

Еще есть книга, но я в нее очень редко заглядываю.

Офлайн

#10 Март 3, 2015 22:36:11

moskitos80
От: Luna
Зарегистрирован: 2015-01-28
Сообщения: 18
Репутация: +  0  -
Профиль  

Tkinter виджет Text "выбрать все"

4kpt_III
Да не вопрос. 99,5% информации отсюда.
Я оказывается тоже в этой документации пытаюсь сориентироваться. И PDF уже конечно стянул Пока я не смог самостоятельно раскопать там ответы на свои вопросы. Буду учить мат.часть. А пока я прочитал только лишь Книгу М.Лутца “Изучаем Python”, и вот сейчас заканчиваю его же “Программирование на Python часть 1”. Просто захотелось немного поглубже разобраться. Хотя может я тороплюсь и где то дальше в книге, или во втором томе про все это рассказывается? Поживем почитаем увидим. В любом случае Вам огромное спасибо за полезную информацию и за то, что уделили мне свое время. Всего Вам наилучшего и удачи.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version