diff -r 5c2aabd7619b Lib/idlelib/Debugger.py --- a/Lib/idlelib/Debugger.py Fri Oct 05 22:16:55 2012 +0300 +++ b/Lib/idlelib/Debugger.py Mon Oct 08 21:40:59 2012 -0500 @@ -60,6 +60,7 @@ self.frame = None self.make_gui() self.interacting = 0 + self.closing = False def run(self, *args): try: @@ -69,17 +70,30 @@ self.interacting = 0 def close(self, event=None): - if self.interacting: + if self.stackviewer: + self.stackviewer.close() + self.stackviewer = None + + if self.interacting or self.pyshell.executing: + self.closing = True + self.quit() # .quit() eventually resumes at .mainloop + # in self.interaction() + else: + self.top.destroy() + + def wm_close(self, event=None): + # Callback for closing the debugger from the debugger window. + if self.interacting or self.pyshell.executing: self.top.bell() - return - if self.stackviewer: - self.stackviewer.close(); self.stackviewer = None - # Clean up pyshell if user clicked debugger control close widget. - # (Causes a harmless extra cycle through close_debugger() if user - # toggled debugger from pyshell Debug menu) - self.pyshell.close_debugger() - # Now close the debugger control window.... - self.top.destroy() + self.bquit.flash() # Let user know to click "Quit" + else: + self.pyshell.close_debugger() + + def set_focus(self, event=None): + # Helper for ScriptBinding + self.bcont.flash() + self.top.focus() + self.top.lift() def make_gui(self): pyshell = self.pyshell @@ -88,8 +102,8 @@ self.top = top = ListedToplevel(root) self.top.wm_title("Debug Control") self.top.wm_iconname("Debug") - top.wm_protocol("WM_DELETE_WINDOW", self.close) - self.top.bind("", self.close) + top.wm_protocol("WM_DELETE_WINDOW", self.wm_close) + self.top.bind("", self.wm_close) # self.bframe = bframe = Frame(top) self.bframe.pack(anchor="w") @@ -103,7 +117,7 @@ bl.append(b) self.bret = b = Button(bframe, text="Out", command=self.ret) bl.append(b) - self.bret = b = Button(bframe, text="Quit", command=self.quit) + self.bquit = b = Button(bframe, text="Quit", command=self.quit) bl.append(b) # for b in bl: @@ -193,6 +207,9 @@ # self.top.wakeup() self.root.mainloop() + if self.closing: + self.top.destroy() + return # for b in self.buttons: b.configure(state="disabled") diff -r 5c2aabd7619b Lib/idlelib/PyShell.py --- a/Lib/idlelib/PyShell.py Fri Oct 05 22:16:55 2012 +0300 +++ b/Lib/idlelib/PyShell.py Mon Oct 08 21:40:59 2012 -0500 @@ -716,7 +716,8 @@ def runcode(self, code): "Override base class method" if self.tkconsole.executing: - self.interp.restart_subprocess() + if use_subprocess: + self.restart_subprocess() self.checklinecache() if self.save_warnings_filters is not None: warnings.filters[:] = self.save_warnings_filters @@ -923,10 +924,11 @@ db.close() if self.interp.rpcclt: RemoteDebugger.close_remote_debugger(self.interp.rpcclt) - self.resetoutput() - self.console.write("[DEBUG OFF]\n") sys.ps1 = ">>> " - self.showprompt() + if not self.closing: + self.resetoutput() + self.console.write("[DEBUG OFF]\n") + self.showprompt() self.set_debugger_indicator() def open_debugger(self): diff -r 5c2aabd7619b Lib/idlelib/ScriptBinding.py --- a/Lib/idlelib/ScriptBinding.py Fri Oct 05 22:16:55 2012 +0300 +++ b/Lib/idlelib/ScriptBinding.py Mon Oct 08 21:40:59 2012 -0500 @@ -83,8 +83,7 @@ return False return True - def checksyntax(self, filename): - self.shell = shell = self.flist.open_shell() + def checksyntax(self, filename, shell): saved_stream = shell.get_warning_stream() shell.set_warning_stream(shell.stderr) f = open(filename, 'rb') @@ -135,16 +134,21 @@ directory to the directory of the module being executed and also add that directory to its sys.path if not already included. """ + shell = self.flist.open_shell() + db = shell.interp.getdebugger() + if db and shell.executing: + db.set_focus() + return 'break' # Don't run if already debugging... filename = self.getfilename() if not filename: return 'break' - code = self.checksyntax(filename) + code = self.checksyntax(filename, shell) if not code: return 'break' if not self.tabnanny(filename): return 'break' - interp = self.shell.interp + interp = shell.interp if PyShell.use_subprocess: interp.restart_subprocess(with_cwd=False) dirname = os.path.dirname(filename)