def __init__(self,parent): self.entre=Text(parent,height=1,background='#FFC757') self.text=Text(parent) self.text.configure(state='disabled') self.scroll=scroll=Scrollbar(self.text) scroll['command'] = self.text.yview scroll.pack(side=RIGHT, fill=Y) self.text['yscrollcommand'] = scroll.set self.warning_stream=sys.__stderr__ self.tkinter_vars = {} # keys: Tkinter event names # values: Tkinter variable instances self.interp = ModifiedInterpreter(self) self.save_stdout = sys.stdout self.save_stderr = sys.stderr self.save_stdin = sys.stdin import IOBinding self.stdin = PseudoInputFile(self, "stdin", IOBinding.encoding) self.stdout = PseudoOutputFile(self, "stdout", IOBinding.encoding) self.stderr = PseudoOutputFile(self, "stderr", IOBinding.encoding) self.console = PseudoOutputFile(self, "console", IOBinding.encoding) sys.stdout = self.stdout sys.stderr = self.stderr sys.stdin = self.stdin self.history = self.History(self.text) self.pollinterval = 50 # millisec ##heritage pyEditor? self.undo = undo = self.ModifiedUndoDelegator() self.io = io = IOBinding.IOBinding(self) self.begin()
class PyShell(Widget): shell_title = "Python " + python_version() + " Shell" from ModifiedColorDelegator import ModifiedColorDelegator from ModifiedUndoDelegator import ModifiedUndoDelegator from IdleHistory import History def __init__(self,parent): self.entre=Text(parent,height=1,background='#FFC757') self.text=Text(parent) self.text.configure(state='disabled') self.scroll=scroll=Scrollbar(self.text) scroll['command'] = self.text.yview scroll.pack(side=RIGHT, fill=Y) self.text['yscrollcommand'] = scroll.set self.warning_stream=sys.__stderr__ self.tkinter_vars = {} # keys: Tkinter event names # values: Tkinter variable instances self.interp = ModifiedInterpreter(self) self.save_stdout = sys.stdout self.save_stderr = sys.stderr self.save_stdin = sys.stdin import IOBinding self.stdin = PseudoInputFile(self, "stdin", IOBinding.encoding) self.stdout = PseudoOutputFile(self, "stdout", IOBinding.encoding) self.stderr = PseudoOutputFile(self, "stderr", IOBinding.encoding) self.console = PseudoOutputFile(self, "console", IOBinding.encoding) sys.stdout = self.stdout sys.stderr = self.stderr sys.stdin = self.stdin self.history = self.History(self.text) self.pollinterval = 50 # millisec ##heritage pyEditor? self.undo = undo = self.ModifiedUndoDelegator() self.io = io = IOBinding.IOBinding(self) self.begin() reading = False executing = False canceled = False endoffile = False closing = False _stop_readline_flag = False COPYRIGHT = 'Type "copyright", "credits" or "license()" for more information.' def set_warning_stream(self, stream): global warning_stream warning_stream = stream def get_warning_stream(self): return self.warning_stream def get_var_obj(self, name, vartype=None): var = self.tkinter_vars.get(name) if not var and vartype: # create a Tkinter variable object with self.text as master: self.tkinter_vars[name] = var = vartype(self.text) return var def run(self,filename): self.write("\n==== run %s ====\n" % (filename)) self.interp.execfile(filename) self.write("==== end run ====\n") self.showprompt() def runit(self,filename=None): self.interp.execfile(filename) self.interp.execfile(filename,self.entre.get(1.0,END)) self.entre.delete(1.0,END) def check(self,pyEditor): self.write("\n==== check %s ====\n" % (pyEditor.long_title())) self.interp.checksyntax(pyEditor) self.write("==== end check ====\n") self.showprompt() def beginexecuting(self): "Helper for ModifiedInterpreter" self.resetoutput() self.executing = 1 def endexecuting(self): "Helper for ModifiedInterpreter" self.executing = 0 self.canceled = 0 self.showprompt() def resetoutput(self): source = self.text.get("iomark", "end-1c") if self.history: self.history.store(source) if self.text.get("end-2c") != "\n": self.text.insert("end-1c", "\n") self.text.mark_set("iomark", "end-1c") def write(self, s, tags=()): if isinstance(s, str) and len(s) and max(s) > '\uffff': # Tk doesn't support outputting non-BMP characters # Let's assume what printed string is not very long, # find first non-BMP character and construct informative # UnicodeEncodeError exception. for start, char in enumerate(s): if char > '\uffff': break raise UnicodeEncodeError("UCS-2", char, start, start+1, 'Non-BMP character not supported in Tk') try: self.text.mark_gravity("iomark", "right") count = self.writebis(s, tags, "iomark") self.text.mark_gravity("iomark", "left") except: raise ###pass # ### 11Aug07 KBK if we are expecting exceptions # let's find out what they are and be specific. if self.canceled: self.canceled = 0 raise KeyboardInterrupt return count def writebis(self, s, tags=(), mark="insert"): if isinstance(s, (bytes, bytes)): s = s.decode(IOBinding.encoding, "replace") self.text.configure(state='normal') self.text.insert(mark, s, tags) self.text.configure(state='disabled') self.text.see(mark) self.text.update() return len(s) def showprompt(self): self.resetoutput() try: s = str(sys.ps1) except: s = "" self.console.write(s) self.text.mark_set("insert", "end-1c") self.io.reset_undo() def begin(self): self.text.mark_set("iomark", "insert") self.resetoutput() sys.displayhook = rpc.displayhook self.write("Python %s on %s\n%s\n" % (sys.version, sys.platform, self.COPYRIGHT)) self.showprompt() import tkinter tkinter._default_root = None # 03Jan04 KBK What's this? return True def readline(self): save = self.reading try: self.reading = 1 finally: self.reading = save if self._stop_readline_flag: self._stop_readline_flag = False return "" line = self.text.get("iomark", "end-1c") if len(line) == 0: # may be EOF if we quit our mainloop with Ctrl-C line = "\n" self.resetoutput() if self.canceled: self.canceled = 0 raise KeyboardInterrupt if self.endoffile: self.endoffile = 0 line = "" return line #heritage PyEditor?? def reset_undo(self): self.undo.reset_undo()