diff --git a/wxPython/wxPython/lib/PyCrust/interpreter.py b/wxPython/wxPython/lib/PyCrust/interpreter.py index aebba75974..e5afd96791 100644 --- a/wxPython/wxPython/lib/PyCrust/interpreter.py +++ b/wxPython/wxPython/lib/PyCrust/interpreter.py @@ -51,6 +51,7 @@ class Interpreter(InteractiveInterpreter): If the passed in command is part of a multi-line command we keep appending the pieces to the last list in commandBuffer until we have a complete command. If not, we delete that last list.""" + command = str(command) # In case the command is unicode. if not self.more: try: del self.commandBuffer[-1] except IndexError: pass @@ -63,9 +64,7 @@ class Interpreter(InteractiveInterpreter): def runsource(self, source): """Compile and run source code in the interpreter.""" stdin, stdout, stderr = sys.stdin, sys.stdout, sys.stderr - sys.stdin = self.stdin - sys.stdout = self.stdout - sys.stderr = self.stderr + sys.stdin, sys.stdout, sys.stderr = self.stdin, self.stdout, self.stderr more = InteractiveInterpreter.runsource(self, source) # If sys.std* is still what we set it to, then restore it. # But, if the executed source changed sys.std*, assume it @@ -86,7 +85,10 @@ class Interpreter(InteractiveInterpreter): """Return list of auto-completion options for a command. The list of options will be based on the locals namespace.""" + stdin, stdout, stderr = sys.stdin, sys.stdout, sys.stderr + sys.stdin, sys.stdout, sys.stderr = self.stdin, self.stdout, self.stderr return introspect.getAutoCompleteList(command, self.locals, *args, **kwds) + sys.stdin, sys.stdout, sys.stderr = stdin, stdout, stderr def getCallTip(self, command='', *args, **kwds): """Return call tip text for a command. diff --git a/wxPython/wxPython/lib/PyCrust/introspect.py b/wxPython/wxPython/lib/PyCrust/introspect.py index a4292961f8..24f44615a2 100644 --- a/wxPython/wxPython/lib/PyCrust/introspect.py +++ b/wxPython/wxPython/lib/PyCrust/introspect.py @@ -217,7 +217,7 @@ def getRoot(command, terminator=None): else: # start represents the last known good point in the line. start = token[2][1] - elif tokenstring in ('[({])}'): + elif len(tokenstring) == 1 and tokenstring in ('[({])}'): # Remember, we're working backwords. # So prefix += tokenstring would be wrong. if prefix in emptyTypes and tokenstring in ('[({'): diff --git a/wxPython/wxPython/lib/PyCrust/shell.py b/wxPython/wxPython/lib/PyCrust/shell.py index ef1166188d..e96a4bed01 100644 --- a/wxPython/wxPython/lib/PyCrust/shell.py +++ b/wxPython/wxPython/lib/PyCrust/shell.py @@ -76,8 +76,13 @@ class ShellFrame(wx.wxFrame, ShellMenu): wx.EVT_CLOSE(self, self.OnCloseWindow) def OnCloseWindow(self, event): - self.shell.destroy() - self.Destroy() + """Event handler for closing.""" + # This isn't working the way I want, but I'll leave it for now. + if self.shell.waiting: + event.Veto(True) + else: + self.shell.destroy() + self.Destroy() class ShellFacade: @@ -244,7 +249,7 @@ class Shell(stc.wxStyledTextCtrl): except: pass def destroy(self): - # del self.interp + del self.interp pass def config(self): @@ -364,7 +369,7 @@ Platform: %s""" % (VERSION, self.revision, self.interp.revision, def OnIdle(self, event): """Free the CPU to do other things.""" if self.waiting: - time.sleep(0.1) + time.sleep(0.05) def OnUpdateUI(self, event): """Check for matching braces.""" @@ -821,32 +826,19 @@ Platform: %s""" % (VERSION, self.revision, self.interp.revision, self.prompt() try: while not reader.input: - time.sleep(0.1) # Free up the CPU. - wx.wxYield() + wx.wxYieldIfNeeded() input = reader.input finally: reader.input = '' reader.isreading = 0 + input = str(input) # In case of Unicode. return input def readlines(self): """Replacement for stdin.readlines().""" lines = [] - input = '' - reader = self.reader - reader.isreading = 1 - try: - while lines[-1:] != ['\n']: - self.prompt() - while not reader.input: - time.sleep(0.1) # Free up the CPU. - wx.wxYield() - input = reader.input - lines.append(input) - reader.input = '' - finally: - reader.input = '' - reader.isreading = 0 + while lines[-1:] != ['\n']: + lines.append(self.readline()) return lines def raw_input(self, prompt=''):