#!/bin/env python3 # #-------------------------------------------------------- """ consoletext --- extends tkinter class Text with stdout and stderr redirection. """ #-------------------------------------------------------- # Written by Tim Edwards # efabless, inc. # September 11, 2016 # Version 0.1 #-------------------------------------------------------- import sys import tkinter class ConsoleText(tkinter.Text): linelimit = 500 class IORedirector(object): '''A general class for redirecting I/O to this Text widget.''' def __init__(self,text_area): self.text_area = text_area class StdoutRedirector(IORedirector): '''A class for redirecting stdout to this Text widget.''' def write(self,str): self.text_area.write(str,False) class StderrRedirector(IORedirector): '''A class for redirecting stderr to this Text widget.''' def write(self,str): self.text_area.write(str,True) def __init__(self, master=None, cnf={}, **kw): '''See the __init__ for Tkinter.Text.''' tkinter.Text.__init__(self, master, cnf, **kw) self.tag_configure('stdout',background='white',foreground='black') self.tag_configure('stderr',background='white',foreground='red') # None of these works! Cannot change selected text background! self.config(selectbackground='blue', selectforeground='white') self.tag_configure('sel',background='blue',foreground='white') def write(self, val, is_stderr=False): lines = int(self.index('end-1c').split('.')[0]) if lines > self.linelimit: self.delete('1.0', str(lines - self.linelimit) + '.0') self.insert('end',val,'stderr' if is_stderr else 'stdout') self.see('end') def limit(self, val): self.linelimit = val