| #!/usr/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 |