]> granicus.if.org Git - python/commitdiff
Fixes #11088: IDLE crashes when using F5 to run a script on OSX with Tk 8.5
authorRonald Oussoren <ronaldoussoren@mac.com>
Tue, 17 May 2011 12:48:40 +0000 (14:48 +0200)
committerRonald Oussoren <ronaldoussoren@mac.com>
Tue, 17 May 2011 12:48:40 +0000 (14:48 +0200)
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.

Lib/idlelib/ScriptBinding.py
Misc/NEWS

index 41e6a59e6d5bf042b900fa900ad76c482ede5217..90972b525922def187c00826830ac162b2646638 100644 (file)
@@ -27,6 +27,7 @@ from idlelib.EditorWindow import EditorWindow
 from idlelib import PyShell, IOBinding
 
 from idlelib.configHandler import idleConf
+from idlelib import macosxSupport
 
 indent_message = """Error: Inconsistent indentation detected!
 
@@ -52,6 +53,9 @@ class ScriptBinding:
         self.flist = self.editwin.flist
         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):
         filename = self.getfilename()
         if not filename:
@@ -116,14 +120,27 @@ class ScriptBinding:
             shell.set_warning_stream(saved_stream)
 
     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.
 
         First check the syntax.  If OK, make sure the shell is active and
         then transfer the arguments, set the run environment's working
         directory to the directory of the module being executed and also
         add that directory to its sys.path if not already included.
-
         """
+
         filename = self.getfilename()
         if not filename:
             return 'break'
index 7db72e77696a56888831833f9f49e3a6adb01b1e..c40136cca60c6ba2216d1bd3c64877d813bbefaf 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -23,6 +23,9 @@ Core and Builtins
 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
   is set in shell.