from Tkinter import * import sys import StringIO import tktools DEMO = """# Prime number demo for i in range(2, 100): for j in range(2, i): if i%j == 0: break else: print i, """ SYNTAX_ERROR = """A Syntax error occurred in the program. Unfortunately I can't tell you where. (Applets don't have access to the exception info yet).""" RUNTIME_ERROR = """An exception occurred while running the program. Unfortunately I can't tell you where. (Applets don't have access to the exception info yet).""" class Python: def __init__(self, master, initial=DEMO): self.master = master self.master['relief'] = 'raised' self.master['borderwidth'] = 2 self.text, self.frame = \ tktools.make_text_box(master, width=40, height=6) self.text.insert('end', DEMO) self.text_output, self.frame_output = \ tktools.make_text_box(master, width=40, height=6) self.frame_output.forget() self.text_errors, self.frame_errors = \ tktools.make_text_box(master, width=40, height=6) self.frame_errors.forget() self.runbutton = Button(master, text='Run', command=self.run) self.runbutton.pack() def run(self): data = self.text.get('1.0', 'end') save_stdout = sys.stdout save_stderr = sys.stderr try: sys.stdout = StringIO.StringIO() sys.stderr = StringIO.StringIO() try: exec data in {'_browser': self.master.grail_browser, '_app': self.master.grail_app} except SyntaxError: sys.stderr.write(SYNTAX_ERROR) except: sys.stderr.write(RUNTIME_ERROR) output = sys.stdout.getvalue() errors = sys.stderr.getvalue() if output: self.text_output.delete('1.0', 'end') self.text_output.insert('end', output) self.frame_output.pack() else: self.frame_output.forget() if errors: self.text_errors.delete('1.0', 'end') self.text_errors.insert('end', errors) self.frame_errors.pack() else: self.frame_errors.forget() finally: sys.stdout = save_stdout sys.stderr = save_stderr if __name__ == '__main__': root = Tk() Python(root) root.mainloop()