From 4c6daf10372af41d4b48dd1ac65d737c64c2d41c Mon Sep 17 00:00:00 2001
From: Ezio Melotti <ezio.melotti@gmail.com>
Date: Mon, 2 Aug 2010 20:40:20 +0000
Subject: [PATCH] Merged revisions 79576-79578 via svnmerge from
 svn+ssh://pythondev@svn.python.org/python/trunk

........
  r79576 | florent.xicluna | 2010-04-02 10:24:52 +0300 (Fri, 02 Apr 2010) | 2 lines

  #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
........
  r79577 | florent.xicluna | 2010-04-02 11:15:26 +0300 (Fri, 02 Apr 2010) | 2 lines

  #7092: Drop the cmp argument.
........
  r79578 | florent.xicluna | 2010-04-02 11:30:21 +0300 (Fri, 02 Apr 2010) | 2 lines

  #7092: silence some py3k warnings
........
---
 Lib/idlelib/AutoComplete.py        | 18 ++++++------
 Lib/idlelib/AutoCompleteWindow.py  | 12 ++++----
 Lib/idlelib/Bindings.py            |  4 +--
 Lib/idlelib/CallTips.py            |  4 +--
 Lib/idlelib/ClassBrowser.py        |  8 +++---
 Lib/idlelib/CodeContext.py         |  2 +-
 Lib/idlelib/ColorDelegator.py      |  6 ++--
 Lib/idlelib/Debugger.py            |  6 ++--
 Lib/idlelib/EditorWindow.py        | 40 +++++++++++++--------------
 Lib/idlelib/FileList.py            |  6 ++--
 Lib/idlelib/FormatParagraph.py     |  2 +-
 Lib/idlelib/GrepDialog.py          |  6 ++--
 Lib/idlelib/HyperParser.py         |  4 +--
 Lib/idlelib/IOBinding.py           |  2 +-
 Lib/idlelib/IdleHistory.py         |  2 +-
 Lib/idlelib/MultiCall.py           | 31 +++++++++++++++------
 Lib/idlelib/ObjectBrowser.py       |  2 +-
 Lib/idlelib/OutputWindow.py        |  9 +++---
 Lib/idlelib/ParenMatch.py          |  4 +--
 Lib/idlelib/PathBrowser.py         |  6 ++--
 Lib/idlelib/Percolator.py          |  4 +--
 Lib/idlelib/PyShell.py             | 44 +++++++++++++++---------------
 Lib/idlelib/RemoteDebugger.py      |  4 +--
 Lib/idlelib/RemoteObjectBrowser.py |  2 +-
 Lib/idlelib/ReplaceDialog.py       |  5 ++--
 Lib/idlelib/ScriptBinding.py       |  4 +--
 Lib/idlelib/SearchDialog.py        |  4 +--
 Lib/idlelib/StackViewer.py         |  4 +--
 Lib/idlelib/TreeWidget.py          |  8 +++---
 Lib/idlelib/UndoDelegator.py       |  5 ++--
 Lib/idlelib/ZoomHeight.py          |  3 +-
 Lib/idlelib/aboutDialog.py         |  8 +++---
 Lib/idlelib/configDialog.py        | 21 ++++++--------
 Lib/idlelib/configHandler.py       | 12 ++------
 Lib/idlelib/keybindingDialog.py    |  4 +--
 Lib/idlelib/macosxSupport.py       | 12 ++++----
 Lib/idlelib/run.py                 | 21 +++++++-------
 37 files changed, 173 insertions(+), 166 deletions(-)

diff --git a/Lib/idlelib/AutoComplete.py b/Lib/idlelib/AutoComplete.py
index d55b799256..fa1733f9a6 100644
--- a/Lib/idlelib/AutoComplete.py
+++ b/Lib/idlelib/AutoComplete.py
@@ -7,12 +7,7 @@ import os
 import sys
 import string
 
-from configHandler import idleConf
-
-import AutoCompleteWindow
-from HyperParser import HyperParser
-
-import __main__
+from idlelib.configHandler import idleConf
 
 # This string includes all chars that may be in a file name (without a path
 # separator)
@@ -23,6 +18,11 @@ ID_CHARS = string.ascii_letters + string.digits + "_"
 # These constants represent the two different types of completions
 COMPLETE_ATTRIBUTES, COMPLETE_FILES = range(1, 2+1)
 
+from idlelib import AutoCompleteWindow
+from idlelib.HyperParser import HyperParser
+
+import __main__
+
 SEPS = os.sep
 if os.altsep:  # e.g. '/' on Windows...
     SEPS += os.altsep
@@ -193,7 +193,7 @@ class AutoComplete:
                         smalll = eval("__all__", namespace)
                         smalll.sort()
                     else:
-                        smalll = filter(lambda s: s[:1] != '_', bigl)
+                        smalll = [s for s in bigl if s[:1] != '_']
                 else:
                     try:
                         entity = self.get_entity(what)
@@ -203,7 +203,7 @@ class AutoComplete:
                             smalll = entity.__all__
                             smalll.sort()
                         else:
-                            smalll = filter(lambda s: s[:1] != '_', bigl)
+                            smalll = [s for s in bigl if s[:1] != '_']
                     except:
                         return [], []
 
@@ -214,7 +214,7 @@ class AutoComplete:
                     expandedpath = os.path.expanduser(what)
                     bigl = os.listdir(expandedpath)
                     bigl.sort()
-                    smalll = filter(lambda s: s[:1] != '.', bigl)
+                    smalll = [s for s in bigl if s[:1] != '.']
                 except OSError:
                     return [], []
 
diff --git a/Lib/idlelib/AutoCompleteWindow.py b/Lib/idlelib/AutoCompleteWindow.py
index 81eeec1bf0..298177fc84 100644
--- a/Lib/idlelib/AutoCompleteWindow.py
+++ b/Lib/idlelib/AutoCompleteWindow.py
@@ -2,8 +2,8 @@
 An auto-completion window for IDLE, used by the AutoComplete extension
 """
 from Tkinter import *
-from MultiCall import MC_SHIFT
-import AutoComplete
+from idlelib.MultiCall import MC_SHIFT
+from idlelib.AutoComplete import COMPLETE_FILES, COMPLETE_ATTRIBUTES
 
 HIDE_VIRTUAL_EVENT_NAME = "<<autocompletewindow-hide>>"
 HIDE_SEQUENCES = ("<FocusOut>", "<ButtonPress>")
@@ -264,7 +264,7 @@ class AutoCompleteWindow:
         if keysym != "Tab":
             self.lastkey_was_tab = False
         if (len(keysym) == 1 or keysym in ("underscore", "BackSpace")
-            or (self.mode==AutoComplete.COMPLETE_FILES and keysym in
+            or (self.mode == COMPLETE_FILES and keysym in
                 ("period", "minus"))) \
            and not (state & ~MC_SHIFT):
             # Normal editing of text
@@ -292,10 +292,10 @@ class AutoCompleteWindow:
             self.hide_window()
             return
 
-        elif (self.mode == AutoComplete.COMPLETE_ATTRIBUTES and keysym in
+        elif (self.mode == COMPLETE_ATTRIBUTES and keysym in
               ("period", "space", "parenleft", "parenright", "bracketleft",
                "bracketright")) or \
-             (self.mode == AutoComplete.COMPLETE_FILES and keysym in
+             (self.mode == COMPLETE_FILES and keysym in
               ("slash", "backslash", "quotedbl", "apostrophe")) \
              and not (state & ~MC_SHIFT):
             # If start is a prefix of the selection, but is not '' when
@@ -303,7 +303,7 @@ class AutoCompleteWindow:
             # selected completion. Anyway, close the list.
             cursel = int(self.listbox.curselection()[0])
             if self.completions[cursel][:len(self.start)] == self.start \
-               and (self.mode==AutoComplete.COMPLETE_ATTRIBUTES or self.start):
+               and (self.mode == COMPLETE_ATTRIBUTES or self.start):
                 self._change_start(self.completions[cursel])
             self.hide_window()
             return
diff --git a/Lib/idlelib/Bindings.py b/Lib/idlelib/Bindings.py
index 1853ff93df..74a93d3b14 100644
--- a/Lib/idlelib/Bindings.py
+++ b/Lib/idlelib/Bindings.py
@@ -9,8 +9,8 @@ windows.
 
 """
 import sys
-from configHandler import idleConf
-import macosxSupport
+from idlelib.configHandler import idleConf
+from idlelib import macosxSupport
 
 menudefs = [
  # underscore prefixes character to underscore
diff --git a/Lib/idlelib/CallTips.py b/Lib/idlelib/CallTips.py
index bd51b7f6a5..f8f31e2fcb 100644
--- a/Lib/idlelib/CallTips.py
+++ b/Lib/idlelib/CallTips.py
@@ -9,8 +9,8 @@ import re
 import sys
 import types
 
-import CallTipWindow
-from HyperParser import HyperParser
+from idlelib import CallTipWindow
+from idlelib.HyperParser import HyperParser
 
 import __main__
 
diff --git a/Lib/idlelib/ClassBrowser.py b/Lib/idlelib/ClassBrowser.py
index e5a60a5134..095b30dad8 100644
--- a/Lib/idlelib/ClassBrowser.py
+++ b/Lib/idlelib/ClassBrowser.py
@@ -14,10 +14,10 @@ import os
 import sys
 import pyclbr
 
-import PyShell
-from WindowList import ListedToplevel
-from TreeWidget import TreeNode, TreeItem, ScrolledCanvas
-from configHandler import idleConf
+from idlelib import PyShell
+from idlelib.WindowList import ListedToplevel
+from idlelib.TreeWidget import TreeNode, TreeItem, ScrolledCanvas
+from idlelib.configHandler import idleConf
 
 class ClassBrowser:
 
diff --git a/Lib/idlelib/CodeContext.py b/Lib/idlelib/CodeContext.py
index 420ec339ca..2f6f737b67 100644
--- a/Lib/idlelib/CodeContext.py
+++ b/Lib/idlelib/CodeContext.py
@@ -11,9 +11,9 @@ not open blocks are not shown in the context hints pane.
 """
 import Tkinter
 from Tkconstants import TOP, LEFT, X, W, SUNKEN
-from configHandler import idleConf
 import re
 from sys import maxint as INFINITY
+from idlelib.configHandler import idleConf
 
 BLOCKOPENERS = set(["class", "def", "elif", "else", "except", "finally", "for",
                     "if", "try", "while", "with"])
diff --git a/Lib/idlelib/ColorDelegator.py b/Lib/idlelib/ColorDelegator.py
index e55f9e6b77..7f4d740ffa 100644
--- a/Lib/idlelib/ColorDelegator.py
+++ b/Lib/idlelib/ColorDelegator.py
@@ -3,8 +3,8 @@ import re
 import keyword
 import __builtin__
 from Tkinter import *
-from Delegator import Delegator
-from configHandler import idleConf
+from idlelib.Delegator import Delegator
+from idlelib.configHandler import idleConf
 
 DEBUG = False
 
@@ -248,7 +248,7 @@ class ColorDelegator(Delegator):
             self.tag_remove(tag, "1.0", "end")
 
 def main():
-    from Percolator import Percolator
+    from idlelib.Percolator import Percolator
     root = Tk()
     root.wm_protocol("WM_DELETE_WINDOW", root.quit)
     text = Text(background="white")
diff --git a/Lib/idlelib/Debugger.py b/Lib/idlelib/Debugger.py
index f56460aad0..04eea3235b 100644
--- a/Lib/idlelib/Debugger.py
+++ b/Lib/idlelib/Debugger.py
@@ -2,9 +2,9 @@ import os
 import bdb
 import types
 from Tkinter import *
-from WindowList import ListedToplevel
-from ScrolledList import ScrolledList
-import macosxSupport
+from idlelib.WindowList import ListedToplevel
+from idlelib.ScrolledList import ScrolledList
+from idlelib import macosxSupport
 
 
 class Idb(bdb.Bdb):
diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
index da051ed6d0..7cc69cbf00 100644
--- a/Lib/idlelib/EditorWindow.py
+++ b/Lib/idlelib/EditorWindow.py
@@ -6,18 +6,18 @@ from itertools import count
 from Tkinter import *
 import tkSimpleDialog
 import tkMessageBox
-from MultiCall import MultiCallCreator
-
 import webbrowser
-import idlever
-import WindowList
-import SearchDialog
-import GrepDialog
-import ReplaceDialog
-import PyParse
-from configHandler import idleConf
-import aboutDialog, textView, configDialog
-import macosxSupport
+
+from idlelib.MultiCall import MultiCallCreator
+from idlelib import idlever
+from idlelib import WindowList
+from idlelib import SearchDialog
+from idlelib import GrepDialog
+from idlelib import ReplaceDialog
+from idlelib import PyParse
+from idlelib.configHandler import idleConf
+from idlelib import aboutDialog, textView, configDialog
+from idlelib import macosxSupport
 
 # The default tab setting for a Text widget, in average-width characters.
 TK_TABWIDTH_DEFAULT = 8
@@ -50,13 +50,13 @@ def _find_module(fullname, path=None):
     return file, filename, descr
 
 class EditorWindow(object):
-    from Percolator import Percolator
-    from ColorDelegator import ColorDelegator
-    from UndoDelegator import UndoDelegator
-    from IOBinding import IOBinding, filesystemencoding, encoding
-    import Bindings
+    from idlelib.Percolator import Percolator
+    from idlelib.ColorDelegator import ColorDelegator
+    from idlelib.UndoDelegator import UndoDelegator
+    from idlelib.IOBinding import IOBinding, filesystemencoding, encoding
+    from idlelib import Bindings
     from Tkinter import Toplevel
-    from MultiStatusBar import MultiStatusBar
+    from idlelib.MultiStatusBar import MultiStatusBar
 
     help_url = None
 
@@ -579,11 +579,11 @@ class EditorWindow(object):
             return None
         head, tail = os.path.split(filename)
         base, ext = os.path.splitext(tail)
-        import ClassBrowser
+        from idlelib import ClassBrowser
         ClassBrowser.ClassBrowser(self.flist, base, [head])
 
     def open_path_browser(self, event=None):
-        import PathBrowser
+        from idlelib import PathBrowser
         PathBrowser.PathBrowser(self.flist)
 
     def gotoline(self, lineno):
@@ -1193,7 +1193,7 @@ class EditorWindow(object):
             if not self.context_use_ps1:
                 for context in self.num_context_lines:
                     startat = max(lno - context, 1)
-                    startatindex = `startat` + ".0"
+                    startatindex = repr(startat) + ".0"
                     rawtext = text.get(startatindex, "insert")
                     y.set_str(rawtext)
                     bod = y.find_good_parse_start(
diff --git a/Lib/idlelib/FileList.py b/Lib/idlelib/FileList.py
index e40c7a7a84..5622805524 100644
--- a/Lib/idlelib/FileList.py
+++ b/Lib/idlelib/FileList.py
@@ -5,8 +5,8 @@ import tkMessageBox
 
 class FileList:
 
-    from EditorWindow import EditorWindow  # class variable, may be overridden
-                                           # e.g. by PyShellFileList
+    # N.B. this import overridden in PyShellFileList.
+    from idlelib.EditorWindow import EditorWindow
 
     def __init__(self, root):
         self.root = root
@@ -106,7 +106,7 @@ class FileList:
 
 
 def _test():
-    from EditorWindow import fixwordbreaks
+    from idlelib.EditorWindow import fixwordbreaks
     import sys
     root = Tk()
     fixwordbreaks(root)
diff --git a/Lib/idlelib/FormatParagraph.py b/Lib/idlelib/FormatParagraph.py
index f30898e8ff..02f96d493a 100644
--- a/Lib/idlelib/FormatParagraph.py
+++ b/Lib/idlelib/FormatParagraph.py
@@ -15,7 +15,7 @@
 # * Fancy comments, like this bulleted list, arent handled :-)
 
 import re
-from configHandler import idleConf
+from idlelib.configHandler import idleConf
 
 class FormatParagraph:
 
diff --git a/Lib/idlelib/GrepDialog.py b/Lib/idlelib/GrepDialog.py
index ab136bc112..e40e5468c0 100644
--- a/Lib/idlelib/GrepDialog.py
+++ b/Lib/idlelib/GrepDialog.py
@@ -2,8 +2,8 @@ import os
 import fnmatch
 import sys
 from Tkinter import *
-import SearchEngine
-from SearchDialogBase import SearchDialogBase
+from idlelib import SearchEngine
+from idlelib.SearchDialogBase import SearchDialogBase
 
 def grep(text, io=None, flist=None):
     root = text._root()
@@ -63,7 +63,7 @@ class GrepDialog(SearchDialogBase):
         if not path:
             self.top.bell()
             return
-        from OutputWindow import OutputWindow
+        from idlelib.OutputWindow import OutputWindow
         save = sys.stdout
         try:
             sys.stdout = OutputWindow(self.flist)
diff --git a/Lib/idlelib/HyperParser.py b/Lib/idlelib/HyperParser.py
index 519de74d15..38a19f2189 100644
--- a/Lib/idlelib/HyperParser.py
+++ b/Lib/idlelib/HyperParser.py
@@ -10,7 +10,7 @@ structure of code, used by extensions to help the user.
 
 import string
 import keyword
-import PyParse
+from idlelib import PyParse
 
 class HyperParser:
 
@@ -31,7 +31,7 @@ class HyperParser:
         if not editwin.context_use_ps1:
             for context in editwin.num_context_lines:
                 startat = max(lno - context, 1)
-                startatindex = `startat` + ".0"
+                startatindex = repr(startat) + ".0"
                 stopatindex = "%d.end" % lno
                 # We add the newline because PyParse requires a newline at end.
                 # We add a space so that index won't be at end of line, so that
diff --git a/Lib/idlelib/IOBinding.py b/Lib/idlelib/IOBinding.py
index 01d278e87c..cbc1c3343e 100644
--- a/Lib/idlelib/IOBinding.py
+++ b/Lib/idlelib/IOBinding.py
@@ -16,7 +16,7 @@ import re
 from Tkinter import *
 from SimpleDialog import SimpleDialog
 
-from configHandler import idleConf
+from idlelib.configHandler import idleConf
 
 try:
     from codecs import BOM_UTF8
diff --git a/Lib/idlelib/IdleHistory.py b/Lib/idlelib/IdleHistory.py
index 960242f781..983a1406d4 100644
--- a/Lib/idlelib/IdleHistory.py
+++ b/Lib/idlelib/IdleHistory.py
@@ -1,4 +1,4 @@
-from configHandler import idleConf
+from idlelib.configHandler import idleConf
 
 class History:
 
diff --git a/Lib/idlelib/MultiCall.py b/Lib/idlelib/MultiCall.py
index e8a3191f5a..5b73481535 100644
--- a/Lib/idlelib/MultiCall.py
+++ b/Lib/idlelib/MultiCall.py
@@ -33,7 +33,7 @@ import sys
 import string
 import re
 import Tkinter
-import macosxSupport
+from idlelib import macosxSupport
 
 # the event type constants, which define the meaning of mc_type
 MC_KEYPRESS=0; MC_KEYRELEASE=1; MC_BUTTONPRESS=2; MC_BUTTONRELEASE=3;
@@ -111,12 +111,27 @@ _state_names = [''.join(m[0]+'-'
                         for i, m in enumerate(_modifiers)
                         if (1 << i) & s)
                 for s in _states]
-_state_subsets = map(lambda i: filter(lambda j: not (j & (~i)), _states),
-                      _states)
-for l in _state_subsets:
-    l.sort(lambda a, b, nummod = lambda x: len(filter(lambda i: (1<<i) & x,
-                                                      range(len(_modifiers)))):
-           nummod(b) - nummod(a))
+
+def expand_substates(states):
+    '''For each item of states return a list containing all combinations of
+    that item with individual bits reset, sorted by the number of set bits.
+    '''
+    def nbits(n):
+        "number of bits set in n base 2"
+        nb = 0
+        while n:
+            n, rem = divmod(n, 2)
+            nb += rem
+        return nb
+    statelist = []
+    for state in states:
+        substates = list(set(state & x for x in states))
+        substates.sort(key=nbits, reverse=True)
+        statelist.append(substates)
+    return statelist
+
+_state_subsets = expand_substates(_states)
+
 # _state_codes gives for each state, the portable code to be passed as mc_state
 _state_codes = []
 for s in _states:
@@ -297,7 +312,7 @@ def MultiCallCreator(widget):
         assert issubclass(widget, Tkinter.Misc)
 
         def __init__(self, *args, **kwargs):
-            apply(widget.__init__, (self,)+args, kwargs)
+            widget.__init__(self, *args, **kwargs)
             # a dictionary which maps a virtual event to a tuple with:
             #  0. the function binded
             #  1. a list of triplets - the sequences it is binded to
diff --git a/Lib/idlelib/ObjectBrowser.py b/Lib/idlelib/ObjectBrowser.py
index a2a6cee498..83830812a2 100644
--- a/Lib/idlelib/ObjectBrowser.py
+++ b/Lib/idlelib/ObjectBrowser.py
@@ -9,7 +9,7 @@
 # XXX TO DO:
 # - for classes/modules, add "open source" to object browser
 
-from TreeWidget import TreeItem, TreeNode, ScrolledCanvas
+from idlelib.TreeWidget import TreeItem, TreeNode, ScrolledCanvas
 
 from repr import Repr
 
diff --git a/Lib/idlelib/OutputWindow.py b/Lib/idlelib/OutputWindow.py
index f6b379b9a6..60d09c0cac 100644
--- a/Lib/idlelib/OutputWindow.py
+++ b/Lib/idlelib/OutputWindow.py
@@ -1,8 +1,8 @@
 from Tkinter import *
-from EditorWindow import EditorWindow
+from idlelib.EditorWindow import EditorWindow
 import re
 import tkMessageBox
-import IOBinding
+from idlelib import IOBinding
 
 class OutputWindow(EditorWindow):
 
@@ -47,8 +47,9 @@ class OutputWindow(EditorWindow):
         self.text.see(mark)
         self.text.update()
 
-    def writelines(self, l):
-        map(self.write, l)
+    def writelines(self, lines):
+        for line in lines:
+            self.write(line)
 
     def flush(self):
         pass
diff --git a/Lib/idlelib/ParenMatch.py b/Lib/idlelib/ParenMatch.py
index 250ae8b702..6d91b390d1 100644
--- a/Lib/idlelib/ParenMatch.py
+++ b/Lib/idlelib/ParenMatch.py
@@ -5,8 +5,8 @@ paren.  Paren here is used generically; the matching applies to
 parentheses, square brackets, and curly braces.
 """
 
-from HyperParser import HyperParser
-from configHandler import idleConf
+from idlelib.HyperParser import HyperParser
+from idlelib.configHandler import idleConf
 
 _openers = {')':'(',']':'[','}':'{'}
 CHECK_DELAY = 100 # miliseconds
diff --git a/Lib/idlelib/PathBrowser.py b/Lib/idlelib/PathBrowser.py
index 86cd2707dc..6b2c0712e6 100644
--- a/Lib/idlelib/PathBrowser.py
+++ b/Lib/idlelib/PathBrowser.py
@@ -2,8 +2,8 @@ import os
 import sys
 import imp
 
-from TreeWidget import TreeItem
-from ClassBrowser import ClassBrowser, ModuleBrowserTreeItem
+from idlelib.TreeWidget import TreeItem
+from idlelib.ClassBrowser import ClassBrowser, ModuleBrowserTreeItem
 
 class PathBrowser(ClassBrowser):
 
@@ -86,7 +86,7 @@ class DirBrowserTreeItem(TreeItem):
         return sorted
 
 def main():
-    import PyShell
+    from idlelib import PyShell
     PathBrowser(PyShell.flist)
     if sys.stdin is sys.__stdin__:
         mainloop()
diff --git a/Lib/idlelib/Percolator.py b/Lib/idlelib/Percolator.py
index ebbcba9e6a..e24689b207 100644
--- a/Lib/idlelib/Percolator.py
+++ b/Lib/idlelib/Percolator.py
@@ -1,5 +1,5 @@
-from WidgetRedirector import WidgetRedirector
-from Delegator import Delegator
+from idlelib.WidgetRedirector import WidgetRedirector
+from idlelib.Delegator import Delegator
 
 class Percolator:
 
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py
index 440052f28e..6524dffa12 100644
--- a/Lib/idlelib/PyShell.py
+++ b/Lib/idlelib/PyShell.py
@@ -11,7 +11,6 @@ import time
 import threading
 import traceback
 import types
-import macosxSupport
 
 import linecache
 from code import InteractiveInterpreter
@@ -24,17 +23,17 @@ except ImportError:
     sys.exit(1)
 import tkMessageBox
 
-from EditorWindow import EditorWindow, fixwordbreaks
-from FileList import FileList
-from ColorDelegator import ColorDelegator
-from UndoDelegator import UndoDelegator
-from OutputWindow import OutputWindow
-from configHandler import idleConf
-import idlever
-
-import rpc
-import Debugger
-import RemoteDebugger
+from idlelib.EditorWindow import EditorWindow, fixwordbreaks
+from idlelib.FileList import FileList
+from idlelib.ColorDelegator import ColorDelegator
+from idlelib.UndoDelegator import UndoDelegator
+from idlelib.OutputWindow import OutputWindow
+from idlelib.configHandler import idleConf
+from idlelib import idlever
+from idlelib import rpc
+from idlelib import Debugger
+from idlelib import RemoteDebugger
+from idlelib import macosxSupport
 
 IDENTCHARS = string.ascii_letters + string.digits + "_"
 LOCALHOST = '127.0.0.1'
@@ -547,13 +546,13 @@ class ModifiedInterpreter(InteractiveInterpreter):
         return
 
     def remote_stack_viewer(self):
-        import RemoteObjectBrowser
+        from idlelib import RemoteObjectBrowser
         oid = self.rpcclt.remotequeue("exec", "stackviewer", ("flist",), {})
         if oid is None:
             self.tkconsole.root.bell()
             return
         item = RemoteObjectBrowser.StubObjectTreeItem(self.rpcclt, oid)
-        from TreeWidget import ScrolledCanvas, TreeNode
+        from idlelib.TreeWidget import ScrolledCanvas, TreeNode
         top = Toplevel(self.tkconsole.root)
         theme = idleConf.GetOption('main','Theme','name')
         background = idleConf.GetHighlight(theme, 'normal')['background']
@@ -593,7 +592,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
         self.save_warnings_filters = warnings.filters[:]
         warnings.filterwarnings(action="error", category=SyntaxWarning)
         if isinstance(source, types.UnicodeType):
-            import IOBinding
+            from idlelib import IOBinding
             try:
                 source = source.encode(IOBinding.encoding)
             except UnicodeError:
@@ -803,7 +802,7 @@ class PyShell(OutputWindow):
 
 
     # New classes
-    from IdleHistory import History
+    from idlelib.IdleHistory import History
 
     def __init__(self, flist=None):
         if use_subprocess:
@@ -841,7 +840,7 @@ class PyShell(OutputWindow):
         self.save_stdout = sys.stdout
         self.save_stderr = sys.stderr
         self.save_stdin = sys.stdin
-        import IOBinding
+        from idlelib import IOBinding
         self.stdout = PseudoFile(self, "stdout", IOBinding.encoding)
         self.stderr = PseudoFile(self, "stderr", IOBinding.encoding)
         self.console = PseudoFile(self, "console", IOBinding.encoding)
@@ -1011,7 +1010,7 @@ class PyShell(OutputWindow):
         if len(line) == 0:  # may be EOF if we quit our mainloop with Ctrl-C
             line = "\n"
         if isinstance(line, unicode):
-            import IOBinding
+            from idlelib import IOBinding
             try:
                 line = line.encode(IOBinding.encoding)
             except UnicodeError:
@@ -1189,7 +1188,7 @@ class PyShell(OutputWindow):
                 "(sys.last_traceback is not defined)",
                 master=self.text)
             return
-        from StackViewer import StackBrowser
+        from idlelib.StackViewer import StackBrowser
         sv = StackBrowser(self.root, self.flist)
 
     def view_restart_mark(self, event=None):
@@ -1243,8 +1242,9 @@ class PseudoFile(object):
     def write(self, s):
         self.shell.write(s, self.tags)
 
-    def writelines(self, l):
-        map(self.write, l)
+    def writelines(self, lines):
+        for line in lines:
+            self.write(line)
 
     def flush(self):
         pass
@@ -1371,7 +1371,7 @@ def main():
             pathx.append(os.path.dirname(filename))
         for dir in pathx:
             dir = os.path.abspath(dir)
-            if not dir in sys.path:
+            if dir not in sys.path:
                 sys.path.insert(0, dir)
     else:
         dir = os.getcwd()
diff --git a/Lib/idlelib/RemoteDebugger.py b/Lib/idlelib/RemoteDebugger.py
index fa234d17c1..ffeffcedc1 100644
--- a/Lib/idlelib/RemoteDebugger.py
+++ b/Lib/idlelib/RemoteDebugger.py
@@ -21,8 +21,8 @@ barrier, in particular frame and traceback objects.
 """
 
 import types
-import rpc
-import Debugger
+from idlelib import rpc
+from idlelib import Debugger
 
 debugging = 0
 
diff --git a/Lib/idlelib/RemoteObjectBrowser.py b/Lib/idlelib/RemoteObjectBrowser.py
index 6ba3391372..43e2c68f30 100644
--- a/Lib/idlelib/RemoteObjectBrowser.py
+++ b/Lib/idlelib/RemoteObjectBrowser.py
@@ -1,4 +1,4 @@
-import rpc
+from idlelib import rpc
 
 def remote_object_tree_item(item):
     wrapper = WrappedObjectTreeItem(item)
diff --git a/Lib/idlelib/ReplaceDialog.py b/Lib/idlelib/ReplaceDialog.py
index c8eb1c8c45..2d6c80261d 100644
--- a/Lib/idlelib/ReplaceDialog.py
+++ b/Lib/idlelib/ReplaceDialog.py
@@ -1,6 +1,7 @@
 from Tkinter import *
-import SearchEngine
-from SearchDialogBase import SearchDialogBase
+
+from idlelib import SearchEngine
+from idlelib.SearchDialogBase import SearchDialogBase
 
 def replace(text):
     root = text._root()
diff --git a/Lib/idlelib/ScriptBinding.py b/Lib/idlelib/ScriptBinding.py
index cb01110726..3a441650a9 100644
--- a/Lib/idlelib/ScriptBinding.py
+++ b/Lib/idlelib/ScriptBinding.py
@@ -23,9 +23,9 @@ import string
 import tabnanny
 import tokenize
 import tkMessageBox
-import PyShell
+from idlelib import PyShell
 
-from configHandler import idleConf
+from idlelib.configHandler import idleConf
 
 IDENTCHARS = string.ascii_letters + string.digits + "_"
 
diff --git a/Lib/idlelib/SearchDialog.py b/Lib/idlelib/SearchDialog.py
index d7124d67ff..7c70b84ee4 100644
--- a/Lib/idlelib/SearchDialog.py
+++ b/Lib/idlelib/SearchDialog.py
@@ -1,7 +1,7 @@
 from Tkinter import *
-import SearchEngine
-from SearchDialogBase import SearchDialogBase
 
+from idlelib import SearchEngine
+from idlelib.SearchDialogBase import SearchDialogBase
 
 def _setup(text):
     root = text._root()
diff --git a/Lib/idlelib/StackViewer.py b/Lib/idlelib/StackViewer.py
index 6b7730bcdb..732773f333 100644
--- a/Lib/idlelib/StackViewer.py
+++ b/Lib/idlelib/StackViewer.py
@@ -2,8 +2,8 @@ import os
 import sys
 import linecache
 
-from TreeWidget import TreeNode, TreeItem, ScrolledCanvas
-from ObjectBrowser import ObjectTreeItem, make_objecttreeitem
+from idlelib.TreeWidget import TreeNode, TreeItem, ScrolledCanvas
+from idlelib.ObjectBrowser import ObjectTreeItem, make_objecttreeitem
 
 def StackBrowser(root, flist=None, tb=None, top=None):
     if top is None:
diff --git a/Lib/idlelib/TreeWidget.py b/Lib/idlelib/TreeWidget.py
index 5299e0e951..7d962feb32 100644
--- a/Lib/idlelib/TreeWidget.py
+++ b/Lib/idlelib/TreeWidget.py
@@ -18,8 +18,8 @@ import os
 from Tkinter import *
 import imp
 
-import ZoomHeight
-from configHandler import idleConf
+from idlelib import ZoomHeight
+from idlelib.configHandler import idleConf
 
 ICONDIR = "Icons"
 
@@ -397,7 +397,7 @@ class FileTreeItem(TreeItem):
             names = os.listdir(self.path)
         except os.error:
             return []
-        names.sort(lambda a, b: cmp(os.path.normcase(a), os.path.normcase(b)))
+        names.sort(key = os.path.normcase)
         sublist = []
         for name in names:
             item = FileTreeItem(os.path.join(self.path, name))
@@ -452,7 +452,7 @@ class ScrolledCanvas:
 # Testing functions
 
 def test():
-    import PyShell
+    from idlelib import PyShell
     root = Toplevel(PyShell.root)
     root.configure(bd=0, bg="yellow")
     root.focus_set()
diff --git a/Lib/idlelib/UndoDelegator.py b/Lib/idlelib/UndoDelegator.py
index 5896bd5d1b..16d3ae198f 100644
--- a/Lib/idlelib/UndoDelegator.py
+++ b/Lib/idlelib/UndoDelegator.py
@@ -1,6 +1,7 @@
 import string
 from Tkinter import *
-from Delegator import Delegator
+
+from idlelib.Delegator import Delegator
 
 #$ event <<redo>>
 #$ win <Control-y>
@@ -336,7 +337,7 @@ class CommandSequence(Command):
         return self.depth
 
 def main():
-    from Percolator import Percolator
+    from idlelib.Percolator import Percolator
     root = Tk()
     root.wm_protocol("WM_DELETE_WINDOW", root.quit)
     text = Text()
diff --git a/Lib/idlelib/ZoomHeight.py b/Lib/idlelib/ZoomHeight.py
index 83ca3a6970..e8d1710751 100644
--- a/Lib/idlelib/ZoomHeight.py
+++ b/Lib/idlelib/ZoomHeight.py
@@ -2,7 +2,8 @@
 
 import re
 import sys
-import macosxSupport
+
+from idlelib import macosxSupport
 
 class ZoomHeight:
 
diff --git a/Lib/idlelib/aboutDialog.py b/Lib/idlelib/aboutDialog.py
index 008602cd26..43a13135ae 100644
--- a/Lib/idlelib/aboutDialog.py
+++ b/Lib/idlelib/aboutDialog.py
@@ -4,9 +4,9 @@
 
 from Tkinter import *
 import os
-import os.path
-import textView
-import idlever
+
+from idlelib import textView
+from idlelib import idlever
 
 class AboutDialog(Toplevel):
     """Modal about dialog for idle
@@ -144,7 +144,7 @@ if __name__ == '__main__':
     # test the dialog
     root = Tk()
     def run():
-        import aboutDialog
+        from idlelib import aboutDialog
         aboutDialog.AboutDialog(root, 'About')
     Button(root, text='Dialog', command=run).pack()
     root.mainloop()
diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py
index 2f66d09520..8d3a49dff7 100644
--- a/Lib/idlelib/configDialog.py
+++ b/Lib/idlelib/configDialog.py
@@ -13,13 +13,13 @@ from Tkinter import *
 import tkMessageBox, tkColorChooser, tkFont
 import string
 
-from configHandler import idleConf
-from dynOptionMenuWidget import DynOptionMenu
-from tabbedpages import TabbedPageSet
-from keybindingDialog import GetKeysDialog
-from configSectionNameDialog import GetCfgSectionNameDialog
-from configHelpSourceEdit import GetHelpSourceDialog
-import macosxSupport
+from idlelib.configHandler import idleConf
+from idlelib.dynOptionMenuWidget import DynOptionMenu
+from idlelib.tabbedpages import TabbedPageSet
+from idlelib.keybindingDialog import GetKeysDialog
+from idlelib.configSectionNameDialog import GetCfgSectionNameDialog
+from idlelib.configHelpSourceEdit import GetHelpSourceDialog
+from idlelib import macosxSupport
 
 class ConfigDialog(Toplevel):
 
@@ -988,16 +988,11 @@ class ConfigDialog(Toplevel):
         self.SetThemeType()
         ##load theme element option menu
         themeNames=self.themeElements.keys()
-        themeNames.sort(self.__ThemeNameIndexCompare)
+        themeNames.sort(key=lambda x: self.themeElements[x][1])
         self.optMenuHighlightTarget.SetMenu(themeNames,themeNames[0])
         self.PaintThemeSample()
         self.SetHighlightTarget()
 
-    def __ThemeNameIndexCompare(self,a,b):
-        if self.themeElements[a][1]<self.themeElements[b][1]: return -1
-        elif self.themeElements[a][1]==self.themeElements[b][1]: return 0
-        else: return 1
-
     def LoadKeyCfg(self):
         ##current keys type radiobutton
         self.keysAreBuiltin.set(idleConf.GetOption('main','Keys','default',
diff --git a/Lib/idlelib/configHandler.py b/Lib/idlelib/configHandler.py
index 3fc2a606fe..b00bdcf39d 100644
--- a/Lib/idlelib/configHandler.py
+++ b/Lib/idlelib/configHandler.py
@@ -20,7 +20,7 @@ configuration problem notification and resolution.
 import os
 import sys
 import string
-import macosxSupport
+from idlelib import macosxSupport
 from ConfigParser import ConfigParser, NoOptionError, NoSectionError
 
 class InvalidConfigType(Exception): pass
@@ -654,17 +654,9 @@ class IdleConf:
                 helpPath=value[1].strip()
             if menuItem and helpPath: #neither are empty strings
                 helpSources.append( (menuItem,helpPath,option) )
-        helpSources.sort(self.__helpsort)
+        helpSources.sort(key=lambda x: int(x[2]))
         return helpSources
 
-    def __helpsort(self, h1, h2):
-        if int(h1[2]) < int(h2[2]):
-            return -1
-        elif int(h1[2]) > int(h2[2]):
-            return 1
-        else:
-            return 0
-
     def GetAllExtraHelpSourcesList(self):
         """
         Returns a list of tuples containing the details of all additional help
diff --git a/Lib/idlelib/keybindingDialog.py b/Lib/idlelib/keybindingDialog.py
index d6d1f18126..5339f88f61 100644
--- a/Lib/idlelib/keybindingDialog.py
+++ b/Lib/idlelib/keybindingDialog.py
@@ -132,7 +132,7 @@ class GetKeysDialog(Toplevel):
         order is also important: key binding equality depends on it, so
         config-keys.def must use the same ordering.
         """
-        import macosxSupport
+        from idlelib import macosxSupport
         if macosxSupport.runningAsOSXApp():
             self.modifiers = ['Shift', 'Control', 'Option', 'Command']
         else:
@@ -167,7 +167,7 @@ class GetKeysDialog(Toplevel):
 
     def GetModifiers(self):
         modList = [variable.get() for variable in self.modifier_vars]
-        return filter(None, modList)
+        return [mod for mod in modList if mod]
 
     def ClearKeySeq(self):
         self.listKeysFinal.select_clear(0,END)
diff --git a/Lib/idlelib/macosxSupport.py b/Lib/idlelib/macosxSupport.py
index bf472c22d2..7ef56f3440 100644
--- a/Lib/idlelib/macosxSupport.py
+++ b/Lib/idlelib/macosxSupport.py
@@ -51,10 +51,10 @@ def overrideRootMenu(root, flist):
     # Due to a (mis-)feature of TkAqua the user will also see an empty Help
     # menu.
     from Tkinter import Menu, Text, Text
-    from EditorWindow import prepstr, get_accelerator
-    import Bindings
-    import WindowList
-    from MultiCall import MultiCallCreator
+    from idlelib.EditorWindow import prepstr, get_accelerator
+    from idlelib import Bindings
+    from idlelib import WindowList
+    from idlelib.MultiCall import MultiCallCreator
 
     menubar = Menu(root)
     root.configure(menu=menubar)
@@ -77,11 +77,11 @@ def overrideRootMenu(root, flist):
     menubar.add_cascade(label='IDLE', menu=menu)
 
     def about_dialog(event=None):
-        import aboutDialog
+        from idlelib import aboutDialog
         aboutDialog.AboutDialog(root, 'About IDLE')
 
     def config_dialog(event=None):
-        import configDialog
+        from idlelib import configDialog
         root.instance_dict = flist.inversedict
         configDialog.ConfigDialog(root, 'Settings')
 
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
index abe94abc8b..270ea15d6d 100644
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -7,13 +7,13 @@ import thread
 import threading
 import Queue
 
-import CallTips
-import AutoComplete
+from idlelib import CallTips
+from idlelib import AutoComplete
 
-import RemoteDebugger
-import RemoteObjectBrowser
-import StackViewer
-import rpc
+from idlelib import RemoteDebugger
+from idlelib import RemoteObjectBrowser
+from idlelib import StackViewer
+from idlelib import rpc
 
 import __main__
 
@@ -118,7 +118,7 @@ def manage_socket(address):
             break
         except socket.error, err:
             print>>sys.__stderr__,"IDLE Subprocess: socket error: "\
-                                        + err[1] + ", retrying...."
+                                        + err.args[1] + ", retrying...."
     else:
         print>>sys.__stderr__, "IDLE Subprocess: Connection to "\
                                "IDLE GUI failed, exiting."
@@ -133,14 +133,15 @@ def show_socket_error(err, address):
     import tkMessageBox
     root = Tkinter.Tk()
     root.withdraw()
-    if err[0] == 61: # connection refused
+    if err.args[0] == 61: # connection refused
         msg = "IDLE's subprocess can't connect to %s:%d.  This may be due "\
               "to your personal firewall configuration.  It is safe to "\
               "allow this internal connection because no data is visible on "\
               "external ports." % address
         tkMessageBox.showerror("IDLE Subprocess Error", msg, parent=root)
     else:
-        tkMessageBox.showerror("IDLE Subprocess Error", "Socket Error: %s" % err[1])
+        tkMessageBox.showerror("IDLE Subprocess Error",
+                               "Socket Error: %s" % err.args[1])
     root.destroy()
 
 def print_exception():
@@ -253,7 +254,7 @@ class MyHandler(rpc.RPCHandler):
         sys.stdin = self.console = self.get_remote_proxy("stdin")
         sys.stdout = self.get_remote_proxy("stdout")
         sys.stderr = self.get_remote_proxy("stderr")
-        import IOBinding
+        from idlelib import IOBinding
         sys.stdin.encoding = sys.stdout.encoding = \
                              sys.stderr.encoding = IOBinding.encoding
         self.interp = self.get_remote_proxy("interp")
-- 
2.40.0