SILENT KILLERPanel

Current Path: > > opt > alt > python27 > lib64 > python2.7 > > idlelib


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: //opt/alt/python27/lib64/python2.7//idlelib

NameTypeSizeLast ModifiedActions
Icons Directory - -
idle_test Directory - -
AutoComplete.py File 8964 bytes January 08 2025 10:43:10.
AutoComplete.pyc File 8181 bytes January 08 2025 10:43:10.
AutoComplete.pyo File 8181 bytes January 08 2025 10:43:10.
AutoCompleteWindow.py File 17318 bytes January 08 2025 10:43:09.
AutoCompleteWindow.pyc File 12714 bytes January 08 2025 10:43:10.
AutoCompleteWindow.pyo File 12655 bytes January 08 2025 10:43:11.
AutoExpand.py File 3395 bytes January 08 2025 10:43:10.
AutoExpand.pyc File 3580 bytes January 08 2025 10:43:11.
AutoExpand.pyo File 3580 bytes January 08 2025 10:43:11.
Bindings.py File 2976 bytes January 08 2025 10:43:09.
Bindings.pyc File 4708 bytes January 08 2025 10:43:09.
Bindings.pyo File 4708 bytes January 08 2025 10:43:09.
CREDITS.txt File 1866 bytes January 08 2025 10:43:11.
CallTipWindow.py File 6065 bytes January 08 2025 10:43:09.
CallTipWindow.pyc File 6292 bytes January 08 2025 10:43:09.
CallTipWindow.pyo File 6292 bytes January 08 2025 10:43:09.
CallTips.py File 7740 bytes January 08 2025 10:43:09.
CallTips.pyc File 8354 bytes January 08 2025 10:43:10.
CallTips.pyo File 8354 bytes January 08 2025 10:43:10.
ChangeLog File 56393 bytes January 08 2025 10:43:11.
ClassBrowser.py File 6999 bytes January 08 2025 10:43:11.
ClassBrowser.pyc File 9890 bytes January 08 2025 10:43:10.
ClassBrowser.pyo File 9890 bytes January 08 2025 10:43:10.
CodeContext.py File 8342 bytes January 08 2025 10:43:09.
CodeContext.pyc File 6788 bytes January 08 2025 10:43:11.
CodeContext.pyo File 6744 bytes January 08 2025 10:43:09.
ColorDelegator.py File 9762 bytes January 08 2025 10:43:09.
ColorDelegator.pyc File 9119 bytes January 08 2025 10:43:10.
ColorDelegator.pyo File 9119 bytes January 08 2025 10:43:10.
Debugger.py File 18236 bytes January 08 2025 10:43:10.
Debugger.pyc File 18144 bytes January 08 2025 10:43:10.
Debugger.pyo File 18144 bytes January 08 2025 10:43:10.
Delegator.py File 665 bytes January 08 2025 10:43:10.
Delegator.pyc File 1346 bytes January 08 2025 10:43:09.
Delegator.pyo File 1346 bytes January 08 2025 10:43:09.
EditorWindow.py File 65498 bytes January 08 2025 10:43:09.
EditorWindow.pyc File 58522 bytes January 08 2025 10:43:09.
EditorWindow.pyo File 58420 bytes January 08 2025 10:43:10.
FileList.py File 3718 bytes January 08 2025 10:43:10.
FileList.pyc File 4168 bytes January 08 2025 10:43:11.
FileList.pyo File 4135 bytes January 08 2025 10:43:10.
FormatParagraph.py File 7287 bytes January 08 2025 10:43:11.
FormatParagraph.pyc File 7311 bytes January 08 2025 10:43:09.
FormatParagraph.pyo File 7311 bytes January 08 2025 10:43:09.
GrepDialog.py File 5145 bytes January 08 2025 10:43:11.
GrepDialog.pyc File 6607 bytes January 08 2025 10:43:11.
GrepDialog.pyo File 6607 bytes January 08 2025 10:43:11.
HISTORY.txt File 10317 bytes January 08 2025 10:43:09.
HyperParser.py File 10497 bytes January 08 2025 10:43:09.
HyperParser.pyc File 6803 bytes January 08 2025 10:43:09.
HyperParser.pyo File 6803 bytes January 08 2025 10:43:09.
IOBinding.py File 21911 bytes January 08 2025 10:43:09.
IOBinding.pyc File 19068 bytes January 08 2025 10:43:11.
IOBinding.pyo File 19068 bytes January 08 2025 10:43:11.
IdleHistory.py File 4052 bytes January 08 2025 10:43:11.
IdleHistory.pyc File 4151 bytes January 08 2025 10:43:11.
IdleHistory.pyo File 4151 bytes January 08 2025 10:43:11.
MultiCall.py File 17701 bytes January 08 2025 10:43:10.
MultiCall.pyc File 16793 bytes January 08 2025 10:43:09.
MultiCall.pyo File 16719 bytes January 08 2025 10:43:09.
MultiStatusBar.py File 1348 bytes January 08 2025 10:43:09.
MultiStatusBar.pyc File 2357 bytes January 08 2025 10:43:11.
MultiStatusBar.pyo File 2357 bytes January 08 2025 10:43:11.
NEWS.txt File 47247 bytes January 08 2025 10:43:10.
ObjectBrowser.py File 4376 bytes January 08 2025 10:43:10.
ObjectBrowser.pyc File 7431 bytes January 08 2025 10:43:10.
ObjectBrowser.pyo File 7431 bytes January 08 2025 10:43:10.
OutputWindow.py File 4576 bytes January 08 2025 10:43:11.
OutputWindow.pyc File 5427 bytes January 08 2025 10:43:10.
OutputWindow.pyo File 5427 bytes January 08 2025 10:43:10.
ParenMatch.py File 6714 bytes January 08 2025 10:43:10.
ParenMatch.pyc File 7350 bytes January 08 2025 10:43:11.
ParenMatch.pyo File 7350 bytes January 08 2025 10:43:11.
PathBrowser.py File 3009 bytes January 08 2025 10:43:09.
PathBrowser.pyc File 4681 bytes January 08 2025 10:43:11.
PathBrowser.pyo File 4681 bytes January 08 2025 10:43:11.
Percolator.py File 3222 bytes January 08 2025 10:43:11.
Percolator.pyc File 4803 bytes January 08 2025 10:43:11.
Percolator.pyo File 4619 bytes January 08 2025 10:43:09.
PyParse.py File 19510 bytes January 08 2025 10:43:10.
PyParse.pyc File 10226 bytes January 08 2025 10:43:09.
PyParse.pyo File 9788 bytes January 08 2025 10:43:10.
PyShell.py File 58872 bytes January 08 2025 10:43:09.
PyShell.pyc File 54269 bytes January 08 2025 10:43:10.
PyShell.pyo File 54167 bytes January 08 2025 10:43:10.
README.txt File 7890 bytes January 08 2025 10:43:10.
RemoteDebugger.py File 11632 bytes January 08 2025 10:43:09.
RemoteDebugger.pyc File 17131 bytes January 08 2025 10:43:10.
RemoteDebugger.pyo File 16977 bytes January 08 2025 10:43:09.
RemoteObjectBrowser.py File 942 bytes January 08 2025 10:43:09.
RemoteObjectBrowser.pyc File 2280 bytes January 08 2025 10:43:10.
RemoteObjectBrowser.pyo File 2280 bytes January 08 2025 10:43:10.
ReplaceDialog.py File 6639 bytes January 08 2025 10:43:10.
ReplaceDialog.pyc File 8016 bytes January 08 2025 10:43:09.
ReplaceDialog.pyo File 8016 bytes January 08 2025 10:43:09.
RstripExtension.py File 1050 bytes January 08 2025 10:43:10.
RstripExtension.pyc File 1665 bytes January 08 2025 10:43:10.
RstripExtension.pyo File 1665 bytes January 08 2025 10:43:10.
ScriptBinding.py File 8459 bytes January 08 2025 10:43:10.
ScriptBinding.pyc File 8370 bytes January 08 2025 10:43:09.
ScriptBinding.pyo File 8370 bytes January 08 2025 10:43:09.
ScrolledList.py File 4373 bytes January 08 2025 10:43:10.
ScrolledList.pyc File 6768 bytes January 08 2025 10:43:09.
ScrolledList.pyo File 6768 bytes January 08 2025 10:43:09.
SearchDialog.py File 2630 bytes January 08 2025 10:43:09.
SearchDialog.pyc File 4139 bytes January 08 2025 10:43:09.
SearchDialog.pyo File 4139 bytes January 08 2025 10:43:09.
SearchDialogBase.py File 7094 bytes January 08 2025 10:43:10.
SearchDialogBase.pyc File 8631 bytes January 08 2025 10:43:11.
SearchDialogBase.pyo File 8631 bytes January 08 2025 10:43:11.
SearchEngine.py File 7463 bytes January 08 2025 10:43:11.
SearchEngine.pyc File 8575 bytes January 08 2025 10:43:10.
SearchEngine.pyo File 8575 bytes January 08 2025 10:43:10.
StackViewer.py File 4431 bytes January 08 2025 10:43:11.
StackViewer.pyc File 6677 bytes January 08 2025 10:43:09.
StackViewer.pyo File 6677 bytes January 08 2025 10:43:09.
TODO.txt File 8478 bytes January 08 2025 10:43:09.
ToolTip.py File 3173 bytes January 08 2025 10:43:11.
ToolTip.pyc File 4890 bytes January 08 2025 10:43:10.
ToolTip.pyo File 4890 bytes January 08 2025 10:43:10.
TreeWidget.py File 15037 bytes January 08 2025 10:43:09.
TreeWidget.pyc File 18383 bytes January 08 2025 10:43:10.
TreeWidget.pyo File 18383 bytes January 08 2025 10:43:10.
UndoDelegator.py File 10787 bytes January 08 2025 10:43:09.
UndoDelegator.pyc File 14218 bytes January 08 2025 10:43:09.
UndoDelegator.pyo File 14218 bytes January 08 2025 10:43:09.
WidgetRedirector.py File 6906 bytes January 08 2025 10:43:09.
WidgetRedirector.pyc File 7951 bytes January 08 2025 10:43:11.
WidgetRedirector.pyo File 7951 bytes January 08 2025 10:43:11.
WindowList.py File 2473 bytes January 08 2025 10:43:09.
WindowList.pyc File 3831 bytes January 08 2025 10:43:10.
WindowList.pyo File 3831 bytes January 08 2025 10:43:10.
ZoomHeight.py File 1300 bytes January 08 2025 10:43:11.
ZoomHeight.pyc File 1711 bytes January 08 2025 10:43:09.
ZoomHeight.pyo File 1711 bytes January 08 2025 10:43:09.
__init__.py File 288 bytes January 08 2025 10:43:09.
__init__.pyc File 444 bytes January 08 2025 10:43:11.
__init__.pyo File 444 bytes January 08 2025 10:43:11.
aboutDialog.py File 7014 bytes January 08 2025 10:43:09.
aboutDialog.pyc File 7017 bytes January 08 2025 10:43:09.
aboutDialog.pyo File 7017 bytes January 08 2025 10:43:09.
config-extensions.def File 2965 bytes January 08 2025 10:43:10.
config-highlight.def File 2515 bytes January 08 2025 10:43:11.
config-keys.def File 7777 bytes January 08 2025 10:43:10.
config-main.def File 2561 bytes January 08 2025 10:43:09.
configDialog.py File 65958 bytes January 08 2025 10:43:09.
configDialog.pyc File 54435 bytes January 08 2025 10:43:11.
configDialog.pyo File 54435 bytes January 08 2025 10:43:11.
configHandler.py File 32485 bytes January 08 2025 10:43:10.
configHandler.pyc File 29985 bytes January 08 2025 10:43:11.
configHandler.pyo File 29985 bytes January 08 2025 10:43:11.
configHelpSourceEdit.py File 6686 bytes January 08 2025 10:43:10.
configHelpSourceEdit.pyc File 6712 bytes January 08 2025 10:43:10.
configHelpSourceEdit.pyo File 6712 bytes January 08 2025 10:43:10.
configSectionNameDialog.py File 4040 bytes January 08 2025 10:43:09.
configSectionNameDialog.pyc File 4510 bytes January 08 2025 10:43:11.
configSectionNameDialog.pyo File 4510 bytes January 08 2025 10:43:11.
dynOptionMenuWidget.py File 1984 bytes January 08 2025 10:43:09.
dynOptionMenuWidget.pyc File 2868 bytes January 08 2025 10:43:09.
dynOptionMenuWidget.pyo File 2868 bytes January 08 2025 10:43:09.
extend.txt File 3642 bytes January 08 2025 10:43:11.
help.html File 42414 bytes January 08 2025 10:43:10.
help.py File 11035 bytes January 08 2025 10:43:10.
help.pyc File 12543 bytes January 08 2025 10:43:09.
help.pyo File 12543 bytes January 08 2025 10:43:09.
help.txt File 12144 bytes January 08 2025 10:43:09.
idle.py File 453 bytes January 08 2025 10:43:09.
idle.pyc File 423 bytes January 08 2025 10:43:09.
idle.pyo File 423 bytes January 08 2025 10:43:09.
idle.pyw File 563 bytes January 08 2025 10:43:10.
idlever.py File 415 bytes January 08 2025 10:43:10.
idlever.pyc File 591 bytes January 08 2025 10:43:10.
idlever.pyo File 591 bytes January 08 2025 10:43:10.
keybindingDialog.py File 12468 bytes January 08 2025 10:43:09.
keybindingDialog.pyc File 12368 bytes January 08 2025 10:43:10.
keybindingDialog.pyo File 12368 bytes January 08 2025 10:43:10.
macosxSupport.py File 8435 bytes January 08 2025 10:43:09.
macosxSupport.pyc File 8585 bytes January 08 2025 10:43:10.
macosxSupport.pyo File 8447 bytes January 08 2025 10:43:09.
rpc.py File 20150 bytes January 08 2025 10:43:10.
rpc.pyc File 22495 bytes January 08 2025 10:43:10.
rpc.pyo File 22389 bytes January 08 2025 10:43:09.
run.py File 12917 bytes January 08 2025 10:43:10.
run.pyc File 13770 bytes January 08 2025 10:43:11.
run.pyo File 13712 bytes January 08 2025 10:43:09.
tabbedpages.py File 18439 bytes January 08 2025 10:43:09.
tabbedpages.pyc File 19081 bytes January 08 2025 10:43:11.
tabbedpages.pyo File 19081 bytes January 08 2025 10:43:11.
textView.py File 3520 bytes January 08 2025 10:43:09.
textView.pyc File 4116 bytes January 08 2025 10:43:10.
textView.pyo File 4116 bytes January 08 2025 10:43:10.

Reading File: //opt/alt/python27/lib64/python2.7//idlelib/UndoDelegator.py

import string
from Tkinter import *

from idlelib.Delegator import Delegator

#$ event <<redo>>
#$ win <Control-y>
#$ unix <Alt-z>

#$ event <<undo>>
#$ win <Control-z>
#$ unix <Control-z>

#$ event <<dump-undo-state>>
#$ win <Control-backslash>
#$ unix <Control-backslash>


class UndoDelegator(Delegator):

    max_undo = 1000

    def __init__(self):
        Delegator.__init__(self)
        self.reset_undo()

    def setdelegate(self, delegate):
        if self.delegate is not None:
            self.unbind("<<undo>>")
            self.unbind("<<redo>>")
            self.unbind("<<dump-undo-state>>")
        Delegator.setdelegate(self, delegate)
        if delegate is not None:
            self.bind("<<undo>>", self.undo_event)
            self.bind("<<redo>>", self.redo_event)
            self.bind("<<dump-undo-state>>", self.dump_event)

    def dump_event(self, event):
        from pprint import pprint
        pprint(self.undolist[:self.pointer])
        print "pointer:", self.pointer,
        print "saved:", self.saved,
        print "can_merge:", self.can_merge,
        print "get_saved():", self.get_saved()
        pprint(self.undolist[self.pointer:])
        return "break"

    def reset_undo(self):
        self.was_saved = -1
        self.pointer = 0
        self.undolist = []
        self.undoblock = 0  # or a CommandSequence instance
        self.set_saved(1)

    def set_saved(self, flag):
        if flag:
            self.saved = self.pointer
        else:
            self.saved = -1
        self.can_merge = False
        self.check_saved()

    def get_saved(self):
        return self.saved == self.pointer

    saved_change_hook = None

    def set_saved_change_hook(self, hook):
        self.saved_change_hook = hook

    was_saved = -1

    def check_saved(self):
        is_saved = self.get_saved()
        if is_saved != self.was_saved:
            self.was_saved = is_saved
            if self.saved_change_hook:
                self.saved_change_hook()

    def insert(self, index, chars, tags=None):
        self.addcmd(InsertCommand(index, chars, tags))

    def delete(self, index1, index2=None):
        self.addcmd(DeleteCommand(index1, index2))

    # Clients should call undo_block_start() and undo_block_stop()
    # around a sequence of editing cmds to be treated as a unit by
    # undo & redo.  Nested matching calls are OK, and the inner calls
    # then act like nops.  OK too if no editing cmds, or only one
    # editing cmd, is issued in between:  if no cmds, the whole
    # sequence has no effect; and if only one cmd, that cmd is entered
    # directly into the undo list, as if undo_block_xxx hadn't been
    # called.  The intent of all that is to make this scheme easy
    # to use:  all the client has to worry about is making sure each
    # _start() call is matched by a _stop() call.

    def undo_block_start(self):
        if self.undoblock == 0:
            self.undoblock = CommandSequence()
        self.undoblock.bump_depth()

    def undo_block_stop(self):
        if self.undoblock.bump_depth(-1) == 0:
            cmd = self.undoblock
            self.undoblock = 0
            if len(cmd) > 0:
                if len(cmd) == 1:
                    # no need to wrap a single cmd
                    cmd = cmd.getcmd(0)
                # this blk of cmds, or single cmd, has already
                # been done, so don't execute it again
                self.addcmd(cmd, 0)

    def addcmd(self, cmd, execute=True):
        if execute:
            cmd.do(self.delegate)
        if self.undoblock != 0:
            self.undoblock.append(cmd)
            return
        if self.can_merge and self.pointer > 0:
            lastcmd = self.undolist[self.pointer-1]
            if lastcmd.merge(cmd):
                return
        self.undolist[self.pointer:] = [cmd]
        if self.saved > self.pointer:
            self.saved = -1
        self.pointer = self.pointer + 1
        if len(self.undolist) > self.max_undo:
            ##print "truncating undo list"
            del self.undolist[0]
            self.pointer = self.pointer - 1
            if self.saved >= 0:
                self.saved = self.saved - 1
        self.can_merge = True
        self.check_saved()

    def undo_event(self, event):
        if self.pointer == 0:
            self.bell()
            return "break"
        cmd = self.undolist[self.pointer - 1]
        cmd.undo(self.delegate)
        self.pointer = self.pointer - 1
        self.can_merge = False
        self.check_saved()
        return "break"

    def redo_event(self, event):
        if self.pointer >= len(self.undolist):
            self.bell()
            return "break"
        cmd = self.undolist[self.pointer]
        cmd.redo(self.delegate)
        self.pointer = self.pointer + 1
        self.can_merge = False
        self.check_saved()
        return "break"


class Command:

    # Base class for Undoable commands

    tags = None

    def __init__(self, index1, index2, chars, tags=None):
        self.marks_before = {}
        self.marks_after = {}
        self.index1 = index1
        self.index2 = index2
        self.chars = chars
        if tags:
            self.tags = tags

    def __repr__(self):
        s = self.__class__.__name__
        t = (self.index1, self.index2, self.chars, self.tags)
        if self.tags is None:
            t = t[:-1]
        return s + repr(t)

    def do(self, text):
        pass

    def redo(self, text):
        pass

    def undo(self, text):
        pass

    def merge(self, cmd):
        return 0

    def save_marks(self, text):
        marks = {}
        for name in text.mark_names():
            if name != "insert" and name != "current":
                marks[name] = text.index(name)
        return marks

    def set_marks(self, text, marks):
        for name, index in marks.items():
            text.mark_set(name, index)


class InsertCommand(Command):

    # Undoable insert command

    def __init__(self, index1, chars, tags=None):
        Command.__init__(self, index1, None, chars, tags)

    def do(self, text):
        self.marks_before = self.save_marks(text)
        self.index1 = text.index(self.index1)
        if text.compare(self.index1, ">", "end-1c"):
            # Insert before the final newline
            self.index1 = text.index("end-1c")
        text.insert(self.index1, self.chars, self.tags)
        self.index2 = text.index("%s+%dc" % (self.index1, len(self.chars)))
        self.marks_after = self.save_marks(text)
        ##sys.__stderr__.write("do: %s\n" % self)

    def redo(self, text):
        text.mark_set('insert', self.index1)
        text.insert(self.index1, self.chars, self.tags)
        self.set_marks(text, self.marks_after)
        text.see('insert')
        ##sys.__stderr__.write("redo: %s\n" % self)

    def undo(self, text):
        text.mark_set('insert', self.index1)
        text.delete(self.index1, self.index2)
        self.set_marks(text, self.marks_before)
        text.see('insert')
        ##sys.__stderr__.write("undo: %s\n" % self)

    def merge(self, cmd):
        if self.__class__ is not cmd.__class__:
            return False
        if self.index2 != cmd.index1:
            return False
        if self.tags != cmd.tags:
            return False
        if len(cmd.chars) != 1:
            return False
        if self.chars and \
           self.classify(self.chars[-1]) != self.classify(cmd.chars):
            return False
        self.index2 = cmd.index2
        self.chars = self.chars + cmd.chars
        return True

    alphanumeric = string.ascii_letters + string.digits + "_"

    def classify(self, c):
        if c in self.alphanumeric:
            return "alphanumeric"
        if c == "\n":
            return "newline"
        return "punctuation"


class DeleteCommand(Command):

    # Undoable delete command

    def __init__(self, index1, index2=None):
        Command.__init__(self, index1, index2, None, None)

    def do(self, text):
        self.marks_before = self.save_marks(text)
        self.index1 = text.index(self.index1)
        if self.index2:
            self.index2 = text.index(self.index2)
        else:
            self.index2 = text.index(self.index1 + " +1c")
        if text.compare(self.index2, ">", "end-1c"):
            # Don't delete the final newline
            self.index2 = text.index("end-1c")
        self.chars = text.get(self.index1, self.index2)
        text.delete(self.index1, self.index2)
        self.marks_after = self.save_marks(text)
        ##sys.__stderr__.write("do: %s\n" % self)

    def redo(self, text):
        text.mark_set('insert', self.index1)
        text.delete(self.index1, self.index2)
        self.set_marks(text, self.marks_after)
        text.see('insert')
        ##sys.__stderr__.write("redo: %s\n" % self)

    def undo(self, text):
        text.mark_set('insert', self.index1)
        text.insert(self.index1, self.chars)
        self.set_marks(text, self.marks_before)
        text.see('insert')
        ##sys.__stderr__.write("undo: %s\n" % self)

class CommandSequence(Command):

    # Wrapper for a sequence of undoable cmds to be undone/redone
    # as a unit

    def __init__(self):
        self.cmds = []
        self.depth = 0

    def __repr__(self):
        s = self.__class__.__name__
        strs = []
        for cmd in self.cmds:
            strs.append("    %r" % (cmd,))
        return s + "(\n" + ",\n".join(strs) + "\n)"

    def __len__(self):
        return len(self.cmds)

    def append(self, cmd):
        self.cmds.append(cmd)

    def getcmd(self, i):
        return self.cmds[i]

    def redo(self, text):
        for cmd in self.cmds:
            cmd.redo(text)

    def undo(self, text):
        cmds = self.cmds[:]
        cmds.reverse()
        for cmd in cmds:
            cmd.undo(text)

    def bump_depth(self, incr=1):
        self.depth = self.depth + incr
        return self.depth

def _undo_delegator(parent):
    from idlelib.Percolator import Percolator
    root = Tk()
    root.title("Test UndoDelegator")
    width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
    root.geometry("+%d+%d"%(x, y + 150))

    text = Text(root)
    text.config(height=10)
    text.pack()
    text.focus_set()
    p = Percolator(text)
    d = UndoDelegator()
    p.insertfilter(d)

    undo = Button(root, text="Undo", command=lambda:d.undo_event(None))
    undo.pack(side='left')
    redo = Button(root, text="Redo", command=lambda:d.redo_event(None))
    redo.pack(side='left')
    dump = Button(root, text="Dump", command=lambda:d.dump_event(None))
    dump.pack(side='left')

    root.mainloop()

if __name__ == "__main__":
    from idlelib.idle_test.htest import run
    run(_undo_delegator)

SILENT KILLER Tool