[Python-checkins] cpython (3.4): Issue #21695: Catch AttributeError created when user closes grep output window

terry.reedy python-checkins at python.org
Tue Jun 10 08:50:19 CEST 2014


http://hg.python.org/cpython/rev/d9c1f36494b6
changeset:   91111:d9c1f36494b6
branch:      3.4
parent:      91107:ca88bcfa5c15
user:        Terry Jan Reedy <tjreedy at udel.edu>
date:        Tue Jun 10 02:49:35 2014 -0400
summary:
  Issue #21695: Catch AttributeError created when user closes grep output window
while still being written to. With no console, this closed Idle.
Also add missing import and a few other changes.

files:
  Lib/idlelib/GrepDialog.py |  49 +++++++++++++++-----------
  1 files changed, 29 insertions(+), 20 deletions(-)


diff --git a/Lib/idlelib/GrepDialog.py b/Lib/idlelib/GrepDialog.py
--- a/Lib/idlelib/GrepDialog.py
+++ b/Lib/idlelib/GrepDialog.py
@@ -1,9 +1,14 @@
 import os
 import fnmatch
+import re  # for htest
 import sys
-from tkinter import *
+from tkinter import StringVar, BooleanVar, Checkbutton  # for GrepDialog
+from tkinter import Tk, Text, Button, SEL, END  # for htest
 from idlelib import SearchEngine
+import itertools
 from idlelib.SearchDialogBase import SearchDialogBase
+# Importing OutputWindow fails due to import loop
+# EditorWindow -> GrepDialop -> OutputWindow -> EditorWindow
 
 def grep(text, io=None, flist=None):
     root = text._root()
@@ -63,7 +68,7 @@
         if not path:
             self.top.bell()
             return
-        from idlelib.OutputWindow import OutputWindow
+        from idlelib.OutputWindow import OutputWindow  # leave here!
         save = sys.stdout
         try:
             sys.stdout = OutputWindow(self.flist)
@@ -79,21 +84,26 @@
         pat = self.engine.getpat()
         print("Searching %r in %s ..." % (pat, path))
         hits = 0
-        for fn in list:
-            try:
-                with open(fn, errors='replace') as f:
-                    for lineno, line in enumerate(f, 1):
-                        if line[-1:] == '\n':
-                            line = line[:-1]
-                        if prog.search(line):
-                            sys.stdout.write("%s: %s: %s\n" %
-                                             (fn, lineno, line))
-                            hits += 1
-            except OSError as msg:
-                print(msg)
-        print(("Hits found: %s\n"
-              "(Hint: right-click to open locations.)"
-              % hits) if hits else "No hits.")
+        try:
+            for fn in list:
+                try:
+                    with open(fn, errors='replace') as f:
+                        for lineno, line in enumerate(f, 1):
+                            if line[-1:] == '\n':
+                                line = line[:-1]
+                            if prog.search(line):
+                                sys.stdout.write("%s: %s: %s\n" %
+                                                 (fn, lineno, line))
+                                hits += 1
+                except OSError as msg:
+                    print(msg)
+            print(("Hits found: %s\n"
+                  "(Hint: right-click to open locations.)"
+                  % hits) if hits else "No hits.")
+        except AttributeError:
+            # Tk window has been closed, OutputWindow.text = None,
+            # so in OW.write, OW.text.insert fails.
+            pass
 
     def findfiles(self, dir, base, rec):
         try:
@@ -120,7 +130,8 @@
             self.top.grab_release()
             self.top.withdraw()
 
-def _grep_dialog(parent):
+
+def _grep_dialog(parent):  # for htest
     from idlelib.PyShell import PyShellFileList
     root = Tk()
     root.title("Test GrepDialog")
@@ -141,8 +152,6 @@
     root.mainloop()
 
 if __name__ == "__main__":
-    # A human test is a bit tricky since EditorWindow() imports this module.
-    # Hence Idle must be restarted after editing this file for a live test.
     import unittest
     unittest.main('idlelib.idle_test.test_grep', verbosity=2, exit=False)
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list