#14254: IDLE now handles readline correctly across shell restarts.

This commit is contained in:
Roger Serwy 2013-04-03 00:42:24 -05:00
parent d7c9d9cdcd
commit ad8cad3c6d
2 changed files with 14 additions and 2 deletions

View File

@ -469,6 +469,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
self.display_no_subprocess_error() self.display_no_subprocess_error()
return None return None
self.transfer_path(with_cwd=with_cwd) self.transfer_path(with_cwd=with_cwd)
console.stop_readline()
# annotate restart in shell window and mark it # annotate restart in shell window and mark it
console.text.delete("iomark", "end-1c") console.text.delete("iomark", "end-1c")
if was_executing: if was_executing:
@ -908,6 +909,7 @@ class PyShell(OutputWindow):
canceled = False canceled = False
endoffile = False endoffile = False
closing = False closing = False
_stop_readline_flag = False
def set_warning_stream(self, stream): def set_warning_stream(self, stream):
global warning_stream global warning_stream
@ -983,8 +985,7 @@ class PyShell(OutputWindow):
parent=self.text) parent=self.text)
if response is False: if response is False:
return "cancel" return "cancel"
if self.reading: self.stop_readline()
self.top.quit()
self.canceled = True self.canceled = True
self.closing = True self.closing = True
# Wait for poll_subprocess() rescheduling to stop # Wait for poll_subprocess() rescheduling to stop
@ -1036,6 +1037,12 @@ class PyShell(OutputWindow):
Tkinter._default_root = None # 03Jan04 KBK What's this? Tkinter._default_root = None # 03Jan04 KBK What's this?
return True return True
def stop_readline(self):
if not self.reading: # no nested mainloop to exit.
return
self._stop_readline_flag = True
self.top.quit()
def readline(self): def readline(self):
save = self.reading save = self.reading
try: try:
@ -1043,6 +1050,9 @@ class PyShell(OutputWindow):
self.top.mainloop() # nested mainloop() self.top.mainloop() # nested mainloop()
finally: finally:
self.reading = save self.reading = save
if self._stop_readline_flag:
self._stop_readline_flag = False
return ""
line = self.text.get("iomark", "end-1c") line = self.text.get("iomark", "end-1c")
if len(line) == 0: # may be EOF if we quit our mainloop with Ctrl-C if len(line) == 0: # may be EOF if we quit our mainloop with Ctrl-C
line = "\n" line = "\n"

View File

@ -12,6 +12,8 @@ Core and Builtins
Library Library
------- -------
- Issue #14254: IDLE now handles readline correctly across shell restarts.
- Issue #17614: IDLE no longer raises exception when quickly closing a file. - Issue #17614: IDLE no longer raises exception when quickly closing a file.
- Issue #13163: Rename operands in smtplib.SMTP._get_socket to correct names; - Issue #13163: Rename operands in smtplib.SMTP._get_socket to correct names;