Первое, когда я пытался реализовать функционал “выбрать все” по нажатию клавиш Ctrl+a:
from tkinter import * root = Tk() text = Text(root) text.pack(expand=YES, fill=BOTH) def select_all(e): e.widget.tag_add(SEL, '1.0', END) text.bind('<Control-a>', select_all) root.mainloop()
Первая же ссылка впоиске гугла по запросу: http://stackoverflow.com/questions/5870561/re-binding-select-all-in-text-widget
где из второго ответа я понял что нужно либо использовать …bind_class но это не есть гуд т.к. определит поведение для всех виджетов класса; либо можно вернуть из обработчика события строку ‘break’ я сделал второе и о чудо - оно заработало:
from tkinter import * root = Tk() text = Text(root) text.pack(expand=YES, fill=BOTH) def select_all(e): e.widget.tag_add(SEL, '1.0', END) return 'break' # ЭТО ДАЛО НУЖНЫЙ ЭФФЕКТ! text.bind('<Control-a>', select_all) root.mainloop()
Второе, когда я делал поиск слова по виджету Text у меня получались странные глюки при находжении нужного слова оно должно выделиться и если оно за пределами экрана должна произвестись прокрутка. Но это происходило через раз! Я решил ради интереса добавить в обработчик return ‘break’ - и оно заработало!
from tkinter import *
from tkinter.simpledialog import *
root = Tk() text = Text(root) text.pack(expand=YES, fill=BOTH) def find_text(e): target = askstring('Find text', 'Search String?') if target: where = e.widget.search(target, INSERT, END) if where: print(where) pastit = where + ('+%dc' % len(target)) e.widget.tag_remove(SEL, '1.0', END) e.widget.tag_add(SEL, where, pastit) e.widget.mark_set(INSERT, pastit) e.widget.see(INSERT) e.widget.focus() return 'break' # РЕШИЛО ПРОБЛЕМУ!!! text.bind('<Control-f>', find_text) root.mainloop()
Там же на stackoverflow была приведена ссылка: http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm где поясняются какие то моменты при работе с событиями, и поиск по странице по слову ‘break’ указал мне на нужный параграф. Там даже примеры кода даются. Но у меня не очень хорошо с английским и я как не бился не смог понять толком о чём там говорится. Объясните пожалуйста, кто “в теме” что тут вообще происходит? Почему return ‘break’ - решило обе проблемы?