class HighlightTextBox(Text): '''Implements a Text box with a syntax highlighter''' def __init__(self, root, *args, **kwargs): Text.__init__(self, root, *args, **kwargs) self.d = ColorDelegator() self.p = Percolator(self) self.p.insertfilter(self.d)
def effect_on_text(self, tag_name=None, value=None): p = Percolator(self.text) if tag_name and value: self.__set_idlelib_tag_defs(tag_name, value) p.insertfilter(self.color_delegator) self.__add_common_event()
class TicText(Text): def __init__(self, parent, spell=None, **kw): Text.__init__(self, parent, wrap="word", font="Times 14", takefocus=True, **kw) self.tg_regexp = re.compile("<[^>]*>") self.bind("<Control-c>", self.copy) self.bind("<Control-x>", self.cut) self.bind("<Return>", self.newline) self.tag_configure("h1", font="Times 16 bold", relief="raised") self.tag_configure("highlight", background="yellow", relief="raised") self.tag_configure("html_tag", foreground="blue") if spell: r, self.wd = pipe() self.rd, w = pipe() args = spell.split() self.sp = Popen(args, stdin=r, stdout=w) self.tag_configure("misspelled", foreground="red", underline=True) self.bind("<space>", self.Spellcheck) self.percolator = Percolator(self) self.percolator.insertfilter(HtmlColorDelegator()) def copy(self, event=None): self.clipboard_clear() text = self.get("sel.first", "sel.last") self.clipboard_append(text) def cut(self, event): self.copy() self.delete("sel.first", "sel.last") def Spellcheck(self, event): """Spellcheck the word preceeding the insertion point""" index = self.search(r"\s", "insert", backwards=True, regexp=True) if index == "": index = "1.0" else: index = self.index("%s+1c" % index) word = self.get(index, "insert") write(self.wd, (word + "\n").encode()) sleep(.01) spell = read(self.rd, 0x0fffffff) rm = len([None for i in spell.splitlines() if i[:1] == b"#"]) if not rm: self.tag_remove("misspelled", index, "%s+%dc" % (index, len(word))) else: self.tag_add("misspelled", index, "%s+%dc" % (index, len(word))) def highlight(self, regexp): text = self.get("1.0", "end") for m in re.finditer(regexp, text, re.I): self.tag_add("highlight", "1.0+%dc" % m.start(), "1.0+%dc" % m.end()) def newline(self, evt): self.insert("insert", "<br/>")
def main(): from idlelib.Percolator import Percolator root = Tk() root.wm_protocol('WM_DELETE_WINDOW', root.quit) text = Text() text.pack() text.focus_set() p = Percolator(text) d = UndoDelegator() p.insertfilter(d) root.mainloop()
def main(): from idlelib.Percolator import Percolator root = Tk() root.wm_protocol('WM_DELETE_WINDOW', root.quit) text = Text() text.pack() text.focus_set() p = Percolator(text) d = UndoDelegator() p.insertfilter(d) root.mainloop()
def main(): from idlelib.Percolator import Percolator root = Tk() root.wm_protocol("WM_DELETE_WINDOW", root.quit) text = Text(background="white") text.pack(expand=1, fill="both") text.focus_set() p = Percolator(text) d = ColorDelegator() p.insertfilter(d) root.mainloop()
def _color_delegator(parent): from idlelib.Percolator import Percolator root = Tk() root.title("Test ColorDelegator") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) root.geometry("+%d+%d" % (x, y + 150)) source = "if somename: x = 'abc' # comment\nprint" text = Text(root, background="white") text.insert("insert", source) text.pack(expand=1, fill="both") p = Percolator(text) d = ColorDelegator() p.insertfilter(d) root.mainloop()
def _color_delegator(parent): from idlelib.Percolator import Percolator root = Tk() root.title("Test ColorDelegator") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) root.geometry("+%d+%d"%(x, y + 150)) source = "if somename: x = 'abc' # comment\nprint" text = Text(root, background="white") text.insert("insert", source) text.pack(expand=1, fill="both") p = Percolator(text) d = ColorDelegator() p.insertfilter(d) root.mainloop()
def _color_delegator(parent): # htest # from Tkinter import Toplevel, Text from idlelib.Percolator import Percolator top = Toplevel(parent) top.title("Test ColorDelegator") top.geometry("200x100+%d+%d" % (parent.winfo_rootx() + 200, parent.winfo_rooty() + 150)) source = "if somename: x = 'abc' # comment\nprint\n" text = Text(top, background="white") text.pack(expand=1, fill="both") text.insert("insert", source) text.focus_set() p = Percolator(text) d = ColorDelegator('.py') p.insertfilter(d)
def _color_delegator(parent): # htest # from Tkinter import Toplevel, Text from idlelib.Percolator import Percolator top = Toplevel(parent) top.title("Test ColorDelegator") top.geometry("200x100+%d+%d" % (parent.winfo_rootx() + 200, parent.winfo_rooty() + 150)) source = "if somename: x = 'abc' # comment\nprint\n" text = Text(top, background="white") text.pack(expand=1, fill="both") text.insert("insert", source) text.focus_set() p = Percolator(text) d = ColorDelegator() p.insertfilter(d)
def makewidgets(self): sbar = Scrollbar(self) text = Text2(self, relief=SUNKEN) text.focus_set() p = Percolator(text) d = ColorDelegator() p.insertfilter(d) sbar.config(command=text.yview) text.config(yscrollcommand=sbar.set) sbar.pack(side=RIGHT, fill=Y) text.pack(side=LEFT, expand=YES, fill=BOTH) self.text = text self.copy = text.copy self.paste = text.paste self.delete = text.delete self.cut = text.cut self.highlight = text.higlight
def _undo_delegator(parent): # htest # import re import tkinter as tk from idlelib.Percolator import Percolator undowin = tk.Toplevel() undowin.title("Test UndoDelegator") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) undowin.geometry("+%d+%d"%(x, y + 150)) text = Text(undowin, height=10) text.pack() text.focus_set() p = Percolator(text) d = UndoDelegator() p.insertfilter(d) undo = Button(undowin, text="Undo", command=lambda:d.undo_event(None)) undo.pack(side='left') redo = Button(undowin, text="Redo", command=lambda:d.redo_event(None)) redo.pack(side='left') dump = Button(undowin, text="Dump", command=lambda:d.dump_event(None)) dump.pack(side='left')
def _undo_delegator(parent): # htest # import re import tkinter as tk from idlelib.Percolator import Percolator undowin = tk.Toplevel() undowin.title("Test UndoDelegator") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) undowin.geometry("+%d+%d" % (x, y + 150)) text = Text(undowin, height=10) text.pack() text.focus_set() p = Percolator(text) d = UndoDelegator() p.insertfilter(d) undo = Button(undowin, text="Undo", command=lambda: d.undo_event(None)) undo.pack(side='left') redo = Button(undowin, text="Redo", command=lambda: d.redo_event(None)) redo.pack(side='left') dump = Button(undowin, text="Dump", command=lambda: d.dump_event(None)) dump.pack(side='left')
def _undo_delegator(parent): from idlelib.Percolator import Percolator root = Tk() root.title("Test UndoDelegator") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) root.geometry("+%d+%d"%(x, y + 150)) text = Text(root) text.config(height=10) text.pack() text.focus_set() p = Percolator(text) d = UndoDelegator() p.insertfilter(d) undo = Button(root, text="Undo", command=lambda:d.undo_event(None)) undo.pack(side='left') redo = Button(root, text="Redo", command=lambda:d.redo_event(None)) redo.pack(side='left') dump = Button(root, text="Dump", command=lambda:d.dump_event(None)) dump.pack(side='left') root.mainloop()
def __init__(self): self.root = Tk(className="EDITOR") self.python_files = PythonFiles(self) self.root.geometry("%dx%d+%d+%d" % ( self.root.winfo_screenwidth() * 0.5, self.root.winfo_screenheight() * 0.4, # self.root.winfo_screenwidth() * 0.1, self.root.winfo_screenheight() * 0.1 0, 0)) self.root.columnconfigure(0, weight=1) self.root.rowconfigure(0, weight=1) self.base_title = "PyEditor v%s" % __version__ self.root.title(self.base_title) self.text_frame = Frame(master=self.root) self.text = ScrolledText(master=self.root, background="white") self.text.bind("<Tab>", self.tab_event) self.text.grid(row=0, column=0, sticky=NSEW) #TODO: find a right height self.exec_output = ScrolledText(master=self.root, height=10, state=DISABLED, background="#dddddd") # for information text like load/save/run: self.exec_output.tag_config( "info", foreground="#0000ff", #background="#eeeeee" ) self.exec_output.grid(row=1, column=0, sticky=NSEW) self.text.focus_set() # self.script_list = ScriptList(self) p = Percolator(self.text) d = ColorDelegator() p.insertfilter(d) # add statusbar to window self.init_statusbar() # add menu to window self.init_menu() # Add special RPi/Minecraft features, if available self.rpi = MinecraftSpecials(self) if self.rpi.mcpi_available: # minecraft is available self.set_content(DEFAULT_MCPI_SCRIPT) if not self.rpi.is_running: self.rpi.startup_minecraft() else: # no minecraft available self.set_content(DEFAULT_SCRIPT) self.root.update()
class CodePack(tkinter.Frame): lineText = None lastChar = "" indentNum = 0 def __init__(self, parent, language="Python", font=("Courier", "10"), numbersWidth=30, *args, **kwargs): '''Initialize CodePack instance''' tkinter.Frame.__init__(self, parent) self.text = ChangeText(self, font=("Courier", 13), wrap="word", spacing3="2", bd=0, undo=True, background="white", *args, **kwargs) self.text.pack(side=tkinter.RIGHT, expand=True, fill="both") self.text.bind("<<Change>>", self._changed) self.text.bind("<Control-KeyRelease-a>", self._highlightLine) self.lineNumbersFrame = tkinter.Frame(self) self.lineNumbersFrame.pack(side=tkinter.LEFT, fill="y") self.lineNumbers = tkinter.Canvas(self.lineNumbersFrame, width=30) self.lineNumbers.pack(expand=True, fill="y") self.font = font self.language = language self.p = Percolator(self.text) self.d = ColorDelegator(language=self.language, bg="white") self.p.insertfilter(self.d) self.text.tag_config("Current Line", background="cornsilk") self._setLanguageBindings() def changeLanguage(self, language): self.language = language del (self.d, self.p) self.p = Percolator(self.text) self.d = ColorDelegator(language=self.language, bg="white") self.p.insertfilter(self.d) def _setLanguageBindings(self): '''Sets the Key Bindings based on the chosen language for text box''' lang = self.language #Overides Tabs for all languages and replaces with spaces def _overrideTab(event): if event.state == 4: pass else: self.text.insert(tkinter.INSERT, " ") return "break" self.text.bind("<Tab>", _overrideTab) # Python (default) language bindings if lang == "Python": def _pythonReturn(event): self.lineText = self.text.get("insert -1l linestart", "insert -1l lineend") if self.lineText: self.lastChar = self.lineText[-1] self.indentNum = len(self.lineText) - len( self.lineText.lstrip(' ')) if self.lastChar == ":": self.indentNum += 4 self.text.insert("insert linestart", " " * self.indentNum) self.text.bind("<KeyRelease-Return>", _pythonReturn) # java lanaguage bindings elif lang == "Java": def _javaReturn(event): self.lineText = self.text.get("insert -1l linestart", "insert -1l lineend") if self.lineText: self.lastChar = self.lineText[-1] self.indentNum = len(self.lineText) - len( self.lineText.lstrip(' ')) if self.lastChar == "{": self.indentNum += 4 elif self.lastChar == "}": if self.indentNum >= 4: self.indentNum += -4 elif self.lastChar.isalnum() or self.lastChar == ')': self.text.insert("insert -1l lineend", ';') self.text.insert("insert linestart", " " * self.indentNum) self.text.bind("<KeyRelease-Return>", _javaReturn) #raise KeyError Exception if the language is not supported else: raise KeyError("Currently unsupported langauge") def _changed(self, event): '''events to process upon change of text box''' self.redrawLineNumbers() self._highlightLine() self.text.edit_separator() def redrawLineNumbers(self): '''redraw line numbers''' self.lineNumbers.delete("all") i = self.text.index("@0,0") while True: dline = self.text.dlineinfo(i) if dline is None: break y = dline[1] linenum = str(i).split(".")[0] self.lineNumbers.create_text(2, y, anchor="nw", text=linenum) i = self.text.index("%s+1line" % i) def _highlightLine(self, event=None): '''highlights the cursor's line in text widget''' self.text.tag_remove("Current Line", "1.0", tkinter.END) if self.text.tag_ranges("sel") == (): self.text.tag_add("Current Line", "insert linestart", "insert lineend+1c") else: self.text.tag_add("Current Line", "insert linestart", "insert lineend+1c") ranges = self.text.tag_ranges("sel") self.text.tag_remove("Current Line", ranges[0], ranges[1])
class ConsoleText(ScrolledText): class StreamObserver(object): def __init__(self, consoleText): self.__consoleText = consoleText def update(self, streamType, content): self.__consoleText.write(streamType, content) def __init__(self, *args, **kwargs): super(ConsoleText, self).__init__(*args, **kwargs) # The shared queue of the PRODUCER-CONSUMER model. self.__queue = Queue.Queue() self.text.tag_configure('STDOUT', foreground='black') self.text.tag_configure('STDERR', foreground='red') self.text.tag_configure('TIP', foreground='forestgreen') self.text.tag_configure('HISTORY', foreground='purple') self.text.tag_configure('RETVAL', foreground='orange') self.text.bind('<KeyPress>', self.onKeyPress) # Experimenting with idlelib.AutoComplete ############################################################# self.indentwidth = 4 self.tabwidth = 4 self.context_use_ps1 = '>>> ' self.__autoComplete = AutoComplete(self) ############################################################# # Syntax highlight is implemented by idlelib ############################################################# self.percolator = Percolator(self.text) self.colorDelegator = ColorDelegator() self.percolator.insertfilter(self.colorDelegator) ############################################################# self.promptSymbol = '>>> ' def updateContent(self, tag, content): r, c = self.getCursorPos(END) start = 'end-5c' stop = 'end-1c' if self.text.get(start, stop) == '>>> ' or self.text.get(start, stop) == '... ': self.text.delete(start, stop) # Record the position of the END before inserting anything. start = self.text.index(END) self.text.insert(END, content, tag) # Remove unnecessary highlighting for tag in self.colorDelegator.tagdefs: self.text.tag_remove(tag, start, "end") self.text.insert(END, self.promptSymbol) # Remove unnecessary highlighting self.text.tag_remove("TODO", "1.0", END) self.text.tag_add("SYNC", "1.0", END) self.text.see(END) def onKeyPress(self, evt, codeList=[]): # Experimenting with idlelib's AutoComplete ############################################################## keysym = evt.keysym if self.__autoComplete.autocompletewindow and \ self.__autoComplete.autocompletewindow.is_active(): if self.__autoComplete.autocompletewindow.keypress_event(evt) == 'break': return 'break' else: if keysym == 'Tab': return 'break' if evt.keysym == 'Tab': return self.__autoComplete.autocomplete_event(evt) ############################################################## if evt.keycode not in range(16, 19) and evt.keycode not in range(33, 41): r, c = self.getCursorPos() prompt = self.text.get(autoSubs('$r.0'), autoSubs('$r.4')) if prompt != '>>> ' and prompt != '... ': return 'break' if evt.keycode==8 and c <= 4: return 'break' if c < 4: return 'break' rend, cend = self.getCursorPos('end-1c') if r < rend: return 'break' if evt.keycode == 13: app = Application.instance code = self.text.get(autoSubs('$r.4'), autoSubs('$r.end')) try: strippedCode = code.strip() if strippedCode and strippedCode[0] == '!': # Execute a system command app.execute(code) self.promptSymbol = '>>> ' self.updateContent(tag='', content='\n') return 'break' if strippedCode == '': code = '\n'.join(codeList) del codeList[:] strippedCode = code.strip() if strippedCode == '': self.promptSymbol = '>>> ' self.updateContent(tag='', content='\n') elif strippedCode[-1] in (':', '\\') or codeList: codeList.append(code) self.promptSymbol = '... ' self.updateContent(tag='', content='\n') else: self.promptSymbol = '>>> ' self.updateContent(tag='', content='\n') try: ret = app.execute(code) except: traceback.print_exc() if ret != None: self.updateContent(tag='RETVAL', content=repr(ret)+'\n') finally: self.text.mark_set(INSERT, END) self.text.see(END) return 'break' def getCursorPos(self, mark=INSERT): return (int(i) for i in self.text.index(mark).split('.'))
def _color_delegator(parent): # htest # from tkinter import Toplevel, Text from idlelib.Percolator import Percolator top = Toplevel(parent) top.title("Test ColorDelegator") top.geometry("200x100+%d+%d" % (parent.winfo_rootx() + 200, parent.winfo_rooty() + 150)) source = "if somename: x = 'abc' # comment\nprint\n" text = Text(top, background="white") text.pack(expand=1, fill="both") text.insert("insert", source) text.focus_set() p = Percolator(text) d = ColorDelegator() p.insertfilter(d) if __name__ == "__main__": from tkinter import Tk, Text from idlelib.Percolator import Percolator root = Tk() text = Text(root) text.pack() d = ColorDelegator() p = Percolator(text) p.insertfilter(d) root.mainloop()
class ConsoleText(ScrolledText): class StreamObserver(object): def __init__(self, console_text): self.__console_text = console_text def update(self, stream_type, content): self.__console_text.write(stream_type, content) def __init__(self, *args, **kwargs): super(ConsoleText, self).__init__(*args, **kwargs) # The shared queue of the PRODUCER-CONSUMER model. self.__queue = Queue.Queue() self.text['wrap'] = 'word' self.text.tag_configure('STDOUT', foreground='black') self.text.tag_configure('STDERR', foreground='red') self.text.tag_configure('TIP', foreground='forestgreen') self.text.tag_configure('HISTORY', foreground='purple') self.text.tag_configure('RETVAL', foreground='orange') self.text.bind('<KeyPress>', self.on_key_press) # Experimenting with idlelib.AutoComplete ############################################################# self.indent_width = 4 self.tab_width = 4 self.context_use_ps1 = '>>> ' self.__auto_complete = AutoComplete(self) ############################################################# # Syntax highlight is implemented by idlelib ############################################################# self.percolator = Percolator(self.text) self.color_delegator = ColorDelegator() self.percolator.insertfilter(self.color_delegator) ############################################################# self.prompt_symbol = '>>> ' def update_content(self, tag, content): r, c = self.get_cursor_pos(END) start = 'end-5c' stop = 'end-1c' if self.text.get(start, stop) == '>>> ' or self.text.get(start, stop) == '... ': self.text.delete(start, stop) # Record the position of the END before inserting anything. start = self.text.index(END) self.text.insert(END, content, tag) # Remove unnecessary highlighting for tag in self.color_delegator.tagdefs: self.text.tag_remove(tag, start, "end") self.text.insert(END, self.prompt_symbol) # Remove unnecessary highlighting self.text.tag_remove("TODO", "1.0", END) self.text.tag_add("SYNC", "1.0", END) self.text.see(END) def on_key_press(self, evt, code_list=[]): # Experimenting with idlelib's AutoComplete ############################################################## keysym = evt.keysym if self.__auto_complete.autocompletewindow and \ self.__auto_complete.autocompletewindow.is_active(): if self.__auto_complete.autocompletewindow.keypress_event(evt) == 'break': return 'break' else: if keysym == 'Tab': return 'break' if evt.keysym == 'Tab': return self.__auto_complete.autocomplete_event(evt) ############################################################## # if evt.keycode not in range(16, 19) and evt.keycode not in range(33, 41): if evt.keysym not in ('Alt_L', 'Alt_R', 'Control_L', 'Control_R', 'Shift_L', 'Shift_R', 'KP_Prior', 'KP_Next', 'KP_Home', 'KP_End', 'KP_Left', 'KP_Right', 'KP_Up', 'KP_Down', 'Left', 'Right', 'Up', 'Down', 'Home', 'End', 'Next', 'Prior'): r, c = self.get_cursor_pos() prompt = self.text.get(auto_subs('$r.0'), auto_subs('$r.4')) if prompt != '>>> ' and prompt != '... ': return 'break' if evt.keysym=='BackSpace' and c <= 4: return 'break' if c < 4: return 'break' rend, cend = self.get_cursor_pos('end-1c') if r < rend: return 'break' if evt.keysym == 'Return': # Return app = Application.instance code = self.text.get(auto_subs('$r.4'), auto_subs('$r.end')) try: stripped_code = code.strip() if stripped_code and stripped_code[0] == '!': # Execute a system command app.execute(code) self.prompt_symbol = '>>> ' self.update_content(tag='', content='\n') return 'break' if stripped_code == '': code = '\n'.join(code_list) del code_list[:] stripped_code = code.strip() if stripped_code == '': self.prompt_symbol = '>>> ' self.update_content(tag='', content='\n') elif code_list or stripped_code[-1] in (':', '\\') or stripped_code[0] in ('@',): # Threre is a bug here for decorators! To do: Solve it. code_list.append(code) self.prompt_symbol = '... ' self.update_content(tag='', content='\n') else: self.prompt_symbol = '>>> ' self.update_content(tag='', content='\n') try: ret = app.execute(code) except: traceback.print_exc() if ret is not None: self.update_content(tag='RETVAL', content=repr(ret)+'\n') finally: self.text.mark_set(INSERT, END) self.text.see(END) return 'break' def get_cursor_pos(self, mark=INSERT): return (int(i) for i in self.text.index(mark).split('.'))
class PercolatorTest(unittest.TestCase): @classmethod def setUpClass(cls): cls.root = Tk() cls.text = Text(cls.root) @classmethod def tearDownClass(cls): del cls.text cls.root.destroy() del cls.root def setUp(self): self.percolator = Percolator(self.text) self.filter_one = MyFilter() self.filter_two = MyFilter() self.percolator.insertfilter(self.filter_one) self.percolator.insertfilter(self.filter_two) def tearDown(self): self.percolator.close() self.text.delete('1.0', END) def test_insertfilter(self): self.assertIsNotNone(self.filter_one.delegate) self.assertEqual(self.percolator.top, self.filter_two) self.assertEqual(self.filter_two.delegate, self.filter_one) self.assertEqual(self.filter_one.delegate, self.percolator.bottom) def test_removefilter(self): filter_three = MyFilter() self.percolator.removefilter(self.filter_two) self.assertEqual(self.percolator.top, self.filter_one) self.assertIsNone(self.filter_two.delegate) filter_three = MyFilter() self.percolator.insertfilter(self.filter_two) self.percolator.insertfilter(filter_three) self.percolator.removefilter(self.filter_one) self.assertEqual(self.percolator.top, filter_three) self.assertEqual(filter_three.delegate, self.filter_two) self.assertEqual(self.filter_two.delegate, self.percolator.bottom) self.assertIsNone(self.filter_one.delegate) def test_insert(self): self.text.insert('insert', 'foo') self.assertEqual(self.text.get('1.0', END), 'foo\n') self.assertTupleEqual(self.filter_one.insert_called_with, ('insert', 'foo', None)) def test_modify_insert(self): self.filter_one.insert = self.filter_one.uppercase_insert self.text.insert('insert', 'bAr') self.assertEqual(self.text.get('1.0', END), 'BAR\n') def test_modify_chain_insert(self): filter_three = MyFilter() self.percolator.insertfilter(filter_three) self.filter_two.insert = self.filter_two.uppercase_insert self.filter_one.insert = self.filter_one.lowercase_insert self.text.insert('insert', 'BaR') self.assertEqual(self.text.get('1.0', END), 'bar\n') def test_dont_insert(self): self.filter_one.insert = self.filter_one.dont_insert self.text.insert('insert', 'foo bar') self.assertEqual(self.text.get('1.0', END), '\n') self.filter_one.insert = self.filter_one.dont_insert self.text.insert('insert', 'foo bar') self.assertEqual(self.text.get('1.0', END), '\n') def test_without_filter(self): self.text.insert('insert', 'hello') self.assertEqual(self.text.get('1.0', 'end'), 'hello\n') def test_delete(self): self.text.insert('insert', 'foo') self.text.delete('1.0', '1.2') self.assertEqual(self.text.get('1.0', END), 'o\n') self.assertTupleEqual(self.filter_one.delete_called_with, ('1.0', '1.2'))
class PercolatorTest(unittest.TestCase): @classmethod def setUpClass(cls): cls.root = Tk() cls.text = Text(cls.root) @classmethod def tearDownClass(cls): cls.text.destroy() cls.root.destroy() del cls.text, cls.root def setUp(self): self.percolator = Percolator(self.text) self.filter_one = MyFilter() self.filter_two = MyFilter() self.percolator.insertfilter(self.filter_one) self.percolator.insertfilter(self.filter_two) def tearDown(self): self.percolator.close() self.text.delete('1.0', END) def test_insertfilter(self): self.assertIsNotNone(self.filter_one.delegate) self.assertEqual(self.percolator.top, self.filter_two) self.assertEqual(self.filter_two.delegate, self.filter_one) self.assertEqual(self.filter_one.delegate, self.percolator.bottom) def test_removefilter(self): filter_three = MyFilter() self.percolator.removefilter(self.filter_two) self.assertEqual(self.percolator.top, self.filter_one) self.assertIsNone(self.filter_two.delegate) filter_three = MyFilter() self.percolator.insertfilter(self.filter_two) self.percolator.insertfilter(filter_three) self.percolator.removefilter(self.filter_one) self.assertEqual(self.percolator.top, filter_three) self.assertEqual(filter_three.delegate, self.filter_two) self.assertEqual(self.filter_two.delegate, self.percolator.bottom) self.assertIsNone(self.filter_one.delegate) def test_insert(self): self.text.insert('insert', 'foo') self.assertEqual(self.text.get('1.0', END), 'foo\n') self.assertTupleEqual(self.filter_one.insert_called_with, ('insert', 'foo', None)) def test_modify_insert(self): self.filter_one.insert = self.filter_one.uppercase_insert self.text.insert('insert', 'bAr') self.assertEqual(self.text.get('1.0', END), 'BAR\n') def test_modify_chain_insert(self): filter_three = MyFilter() self.percolator.insertfilter(filter_three) self.filter_two.insert = self.filter_two.uppercase_insert self.filter_one.insert = self.filter_one.lowercase_insert self.text.insert('insert', 'BaR') self.assertEqual(self.text.get('1.0', END), 'bar\n') def test_dont_insert(self): self.filter_one.insert = self.filter_one.dont_insert self.text.insert('insert', 'foo bar') self.assertEqual(self.text.get('1.0', END), '\n') self.filter_one.insert = self.filter_one.dont_insert self.text.insert('insert', 'foo bar') self.assertEqual(self.text.get('1.0', END), '\n') def test_without_filter(self): self.text.insert('insert', 'hello') self.assertEqual(self.text.get('1.0', 'end'), 'hello\n') def test_delete(self): self.text.insert('insert', 'foo') self.text.delete('1.0', '1.2') self.assertEqual(self.text.get('1.0', END), 'o\n') self.assertTupleEqual(self.filter_one.delete_called_with, ('1.0', '1.2'))
def add_colors_to_text(text): color_config(text) p = Percolator(text) d = ColorDelegator() p.insertfilter(d)