| from tkinter import * |
| |
| from idlelib import SearchEngine |
| from idlelib.SearchDialogBase import SearchDialogBase |
| |
| def _setup(text): |
| root = text._root() |
| engine = SearchEngine.get(root) |
| if not hasattr(engine, "_searchdialog"): |
| engine._searchdialog = SearchDialog(root, engine) |
| return engine._searchdialog |
| |
| def find(text): |
| pat = text.get("sel.first", "sel.last") |
| return _setup(text).open(text,pat) |
| |
| def find_again(text): |
| return _setup(text).find_again(text) |
| |
| def find_selection(text): |
| return _setup(text).find_selection(text) |
| |
| class SearchDialog(SearchDialogBase): |
| |
| def create_widgets(self): |
| SearchDialogBase.create_widgets(self) |
| self.make_button("Find Next", self.default_command, 1) |
| |
| def default_command(self, event=None): |
| if not self.engine.getprog(): |
| return |
| self.find_again(self.text) |
| |
| def find_again(self, text): |
| if not self.engine.getpat(): |
| self.open(text) |
| return False |
| if not self.engine.getprog(): |
| return False |
| res = self.engine.search_text(text) |
| if res: |
| line, m = res |
| i, j = m.span() |
| first = "%d.%d" % (line, i) |
| last = "%d.%d" % (line, j) |
| try: |
| selfirst = text.index("sel.first") |
| sellast = text.index("sel.last") |
| if selfirst == first and sellast == last: |
| text.bell() |
| return False |
| except TclError: |
| pass |
| text.tag_remove("sel", "1.0", "end") |
| text.tag_add("sel", first, last) |
| text.mark_set("insert", self.engine.isback() and first or last) |
| text.see("insert") |
| return True |
| else: |
| text.bell() |
| return False |
| |
| def find_selection(self, text): |
| pat = text.get("sel.first", "sel.last") |
| if pat: |
| self.engine.setcookedpat(pat) |
| return self.find_again(text) |
| |
| def _search_dialog(parent): |
| root = Tk() |
| root.title("Test SearchDialog") |
| width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) |
| root.geometry("+%d+%d"%(x, y + 150)) |
| text = Text(root) |
| text.pack() |
| text.insert("insert","This is a sample string.\n"*10) |
| |
| def show_find(): |
| text.tag_add(SEL, "1.0", END) |
| s = _setup(text) |
| s.open(text) |
| text.tag_remove(SEL, "1.0", END) |
| |
| button = Button(root, text="Search", command=show_find) |
| button.pack() |
| |
| if __name__ == '__main__': |
| from idlelib.idle_test.htest import run |
| run(_search_dialog) |