Fixes #11088: IDLE crashes when using F5 to run a script on OSX with Tk 8.5

Without this patch IDLE will crash reliably on OSX when Tkinter
is linked to TkCocoa 8.5.x.

To reproduce:

* Create a new file (script.py) with the following two lines:

x = input('prompt: ')
print(x)

* Save the script

* Run the script using the F5 keyboard shortcut
  (running from the menu works fine)

The patch is a fairly crude hack, but we haven't found a better
workaround for this Tk bug yet.
This commit is contained in:
Ronald Oussoren 2011-05-17 14:48:40 +02:00
parent 6edd8c1faf
commit 5ee0567bb2
2 changed files with 21 additions and 1 deletions

View File

@ -27,6 +27,7 @@ from idlelib.EditorWindow import EditorWindow
from idlelib import PyShell, IOBinding from idlelib import PyShell, IOBinding
from idlelib.configHandler import idleConf from idlelib.configHandler import idleConf
from idlelib import macosxSupport
indent_message = """Error: Inconsistent indentation detected! indent_message = """Error: Inconsistent indentation detected!
@ -52,6 +53,9 @@ class ScriptBinding:
self.flist = self.editwin.flist self.flist = self.editwin.flist
self.root = self.editwin.root self.root = self.editwin.root
if macosxSupport.runningAsOSXApp():
self.editwin.text_frame.bind('<<run-module-event-2>>', self._run_module_event)
def check_module_event(self, event): def check_module_event(self, event):
filename = self.getfilename() filename = self.getfilename()
if not filename: if not filename:
@ -116,14 +120,27 @@ class ScriptBinding:
shell.set_warning_stream(saved_stream) shell.set_warning_stream(saved_stream)
def run_module_event(self, event): def run_module_event(self, event):
if macosxSupport.runningAsOSXApp():
# Tk-Cocoa in MacOSX is broken until at least
# Tk 8.5.9, and without this rather
# crude workaround IDLE would hang when a user
# tries to run a module using the keyboard shortcut
# (the menu item works fine).
self.editwin.text_frame.after(200,
lambda: self.editwin.text_frame.event_generate('<<run-module-event-2>>'))
return 'break'
else:
return self._run_module_event(event)
def _run_module_event(self, event):
"""Run the module after setting up the environment. """Run the module after setting up the environment.
First check the syntax. If OK, make sure the shell is active and First check the syntax. If OK, make sure the shell is active and
then transfer the arguments, set the run environment's working then transfer the arguments, set the run environment's working
directory to the directory of the module being executed and also directory to the directory of the module being executed and also
add that directory to its sys.path if not already included. add that directory to its sys.path if not already included.
""" """
filename = self.getfilename() filename = self.getfilename()
if not filename: if not filename:
return 'break' return 'break'

View File

@ -23,6 +23,9 @@ Core and Builtins
Library Library
------- -------
- Issue #11088: don't crash when using F5 to run a script in IDLE on MacOSX
with Tk 8.5.
- Issue #9516: Issue #9516: avoid errors in sysconfig when MACOSX_DEPLOYMENT_TARGET - Issue #9516: Issue #9516: avoid errors in sysconfig when MACOSX_DEPLOYMENT_TARGET
is set in shell. is set in shell.