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///keybindingDialog.py

"""
Dialog for building Tkinter accelerator key bindings
"""
from Tkinter import *
import tkMessageBox
import string
import sys

class GetKeysDialog(Toplevel):
    def __init__(self,parent,title,action,currentKeySequences,_htest=False):
        """
        action - string, the name of the virtual event these keys will be
                 mapped to
        currentKeys - list, a list of all key sequence lists currently mapped
                 to virtual events, for overlap checking
        _htest - bool, change box location when running htest
        """
        Toplevel.__init__(self, parent)
        self.configure(borderwidth=5)
        self.resizable(height=FALSE,width=FALSE)
        self.title(title)
        self.transient(parent)
        self.grab_set()
        self.protocol("WM_DELETE_WINDOW", self.Cancel)
        self.parent = parent
        self.action=action
        self.currentKeySequences=currentKeySequences
        self.result=''
        self.keyString=StringVar(self)
        self.keyString.set('')
        self.SetModifiersForPlatform() # set self.modifiers, self.modifier_label
        self.modifier_vars = []
        for modifier in self.modifiers:
            variable = StringVar(self)
            variable.set('')
            self.modifier_vars.append(variable)
        self.advanced = False
        self.CreateWidgets()
        self.LoadFinalKeyList()
        self.withdraw() #hide while setting geometry
        self.update_idletasks()
        self.geometry(
                "+%d+%d" % (
                    parent.winfo_rootx() +
                    (parent.winfo_width()/2 - self.winfo_reqwidth()/2),
                    parent.winfo_rooty() +
                    ((parent.winfo_height()/2 - self.winfo_reqheight()/2)
                    if not _htest else 150)
                ) )  #centre dialog over parent (or below htest box)
        self.deiconify() #geometry set, unhide
        self.wait_window()

    def CreateWidgets(self):
        frameMain = Frame(self,borderwidth=2,relief=SUNKEN)
        frameMain.pack(side=TOP,expand=TRUE,fill=BOTH)
        frameButtons=Frame(self)
        frameButtons.pack(side=BOTTOM,fill=X)
        self.buttonOK = Button(frameButtons,text='OK',
                width=8,command=self.OK)
        self.buttonOK.grid(row=0,column=0,padx=5,pady=5)
        self.buttonCancel = Button(frameButtons,text='Cancel',
                width=8,command=self.Cancel)
        self.buttonCancel.grid(row=0,column=1,padx=5,pady=5)
        self.frameKeySeqBasic = Frame(frameMain)
        self.frameKeySeqAdvanced = Frame(frameMain)
        self.frameControlsBasic = Frame(frameMain)
        self.frameHelpAdvanced = Frame(frameMain)
        self.frameKeySeqAdvanced.grid(row=0,column=0,sticky=NSEW,padx=5,pady=5)
        self.frameKeySeqBasic.grid(row=0,column=0,sticky=NSEW,padx=5,pady=5)
        self.frameKeySeqBasic.lift()
        self.frameHelpAdvanced.grid(row=1,column=0,sticky=NSEW,padx=5)
        self.frameControlsBasic.grid(row=1,column=0,sticky=NSEW,padx=5)
        self.frameControlsBasic.lift()
        self.buttonLevel = Button(frameMain,command=self.ToggleLevel,
                text='Advanced Key Binding Entry >>')
        self.buttonLevel.grid(row=2,column=0,stick=EW,padx=5,pady=5)
        labelTitleBasic = Label(self.frameKeySeqBasic,
                text="New keys for  '"+self.action+"' :")
        labelTitleBasic.pack(anchor=W)
        labelKeysBasic = Label(self.frameKeySeqBasic,justify=LEFT,
                textvariable=self.keyString,relief=GROOVE,borderwidth=2)
        labelKeysBasic.pack(ipadx=5,ipady=5,fill=X)
        self.modifier_checkbuttons = {}
        column = 0
        for modifier, variable in zip(self.modifiers, self.modifier_vars):
            label = self.modifier_label.get(modifier, modifier)
            check=Checkbutton(self.frameControlsBasic,
                command=self.BuildKeyString,
                text=label,variable=variable,onvalue=modifier,offvalue='')
            check.grid(row=0,column=column,padx=2,sticky=W)
            self.modifier_checkbuttons[modifier] = check
            column += 1
        labelFnAdvice=Label(self.frameControlsBasic,justify=LEFT,
                            text=\
                            "Select the desired modifier keys\n"+
                            "above, and the final key from the\n"+
                            "list on the right.\n\n" +
                            "Use upper case Symbols when using\n" +
                            "the Shift modifier.  (Letters will be\n" +
                            "converted automatically.)")
        labelFnAdvice.grid(row=1,column=0,columnspan=4,padx=2,sticky=W)
        self.listKeysFinal=Listbox(self.frameControlsBasic,width=15,height=10,
                selectmode=SINGLE)
        self.listKeysFinal.bind('<ButtonRelease-1>',self.FinalKeySelected)
        self.listKeysFinal.grid(row=0,column=4,rowspan=4,sticky=NS)
        scrollKeysFinal=Scrollbar(self.frameControlsBasic,orient=VERTICAL,
                command=self.listKeysFinal.yview)
        self.listKeysFinal.config(yscrollcommand=scrollKeysFinal.set)
        scrollKeysFinal.grid(row=0,column=5,rowspan=4,sticky=NS)
        self.buttonClear=Button(self.frameControlsBasic,
                text='Clear Keys',command=self.ClearKeySeq)
        self.buttonClear.grid(row=2,column=0,columnspan=4)
        labelTitleAdvanced = Label(self.frameKeySeqAdvanced,justify=LEFT,
                text="Enter new binding(s) for  '"+self.action+"' :\n"+
                "(These bindings will not be checked for validity!)")
        labelTitleAdvanced.pack(anchor=W)
        self.entryKeysAdvanced=Entry(self.frameKeySeqAdvanced,
                textvariable=self.keyString)
        self.entryKeysAdvanced.pack(fill=X)
        labelHelpAdvanced=Label(self.frameHelpAdvanced,justify=LEFT,
            text="Key bindings are specified using Tkinter keysyms as\n"+
                 "in these samples: <Control-f>, <Shift-F2>, <F12>,\n"
                 "<Control-space>, <Meta-less>, <Control-Alt-Shift-X>.\n"
                 "Upper case is used when the Shift modifier is present!\n\n" +
                 "'Emacs style' multi-keystroke bindings are specified as\n" +
                 "follows: <Control-x><Control-y>, where the first key\n" +
                 "is the 'do-nothing' keybinding.\n\n" +
                 "Multiple separate bindings for one action should be\n"+
                 "separated by a space, eg., <Alt-v> <Meta-v>." )
        labelHelpAdvanced.grid(row=0,column=0,sticky=NSEW)

    def SetModifiersForPlatform(self):
        """Determine list of names of key modifiers for this platform.

        The names are used to build Tk bindings -- it doesn't matter if the
        keyboard has these keys, it matters if Tk understands them. The
        order is also important: key binding equality depends on it, so
        config-keys.def must use the same ordering.
        """
        if sys.platform == "darwin":
            self.modifiers = ['Shift', 'Control', 'Option', 'Command']
        else:
            self.modifiers = ['Control', 'Alt', 'Shift']
        self.modifier_label = {'Control': 'Ctrl'} # short name

    def ToggleLevel(self):
        if  self.buttonLevel.cget('text')[:8]=='Advanced':
            self.ClearKeySeq()
            self.buttonLevel.config(text='<< Basic Key Binding Entry')
            self.frameKeySeqAdvanced.lift()
            self.frameHelpAdvanced.lift()
            self.entryKeysAdvanced.focus_set()
            self.advanced = True
        else:
            self.ClearKeySeq()
            self.buttonLevel.config(text='Advanced Key Binding Entry >>')
            self.frameKeySeqBasic.lift()
            self.frameControlsBasic.lift()
            self.advanced = False

    def FinalKeySelected(self,event):
        self.BuildKeyString()

    def BuildKeyString(self):
        keyList = modifiers = self.GetModifiers()
        finalKey = self.listKeysFinal.get(ANCHOR)
        if finalKey:
            finalKey = self.TranslateKey(finalKey, modifiers)
            keyList.append(finalKey)
        self.keyString.set('<' + string.join(keyList,'-') + '>')

    def GetModifiers(self):
        modList = [variable.get() for variable in self.modifier_vars]
        return [mod for mod in modList if mod]

    def ClearKeySeq(self):
        self.listKeysFinal.select_clear(0,END)
        self.listKeysFinal.yview(MOVETO, '0.0')
        for variable in self.modifier_vars:
            variable.set('')
        self.keyString.set('')

    def LoadFinalKeyList(self):
        #these tuples are also available for use in validity checks
        self.functionKeys=('F1','F2','F3','F4','F5','F6','F7','F8','F9',
                'F10','F11','F12')
        self.alphanumKeys=tuple(string.ascii_lowercase+string.digits)
        self.punctuationKeys=tuple('~!@#%^&*()_-+={}[]|;:,.<>/?')
        self.whitespaceKeys=('Tab','Space','Return')
        self.editKeys=('BackSpace','Delete','Insert')
        self.moveKeys=('Home','End','Page Up','Page Down','Left Arrow',
                'Right Arrow','Up Arrow','Down Arrow')
        #make a tuple of most of the useful common 'final' keys
        keys=(self.alphanumKeys+self.punctuationKeys+self.functionKeys+
                self.whitespaceKeys+self.editKeys+self.moveKeys)
        self.listKeysFinal.insert(END, *keys)

    def TranslateKey(self, key, modifiers):
        "Translate from keycap symbol to the Tkinter keysym"
        translateDict = {'Space':'space',
                '~':'asciitilde','!':'exclam','@':'at','#':'numbersign',
                '%':'percent','^':'asciicircum','&':'ampersand','*':'asterisk',
                '(':'parenleft',')':'parenright','_':'underscore','-':'minus',
                '+':'plus','=':'equal','{':'braceleft','}':'braceright',
                '[':'bracketleft',']':'bracketright','|':'bar',';':'semicolon',
                ':':'colon',',':'comma','.':'period','<':'less','>':'greater',
                '/':'slash','?':'question','Page Up':'Prior','Page Down':'Next',
                'Left Arrow':'Left','Right Arrow':'Right','Up Arrow':'Up',
                'Down Arrow': 'Down', 'Tab':'Tab'}
        if key in translateDict.keys():
            key = translateDict[key]
        if 'Shift' in modifiers and key in string.ascii_lowercase:
            key = key.upper()
        key = 'Key-' + key
        return key

    def OK(self, event=None):
        if self.advanced or self.KeysOK():  # doesn't check advanced string yet
            self.result=self.keyString.get()
            self.grab_release()
            self.destroy()

    def Cancel(self, event=None):
        self.result=''
        self.grab_release()
        self.destroy()

    def KeysOK(self):
        '''Validity check on user's 'basic' keybinding selection.

        Doesn't check the string produced by the advanced dialog because
        'modifiers' isn't set.

        '''
        keys = self.keyString.get()
        keys.strip()
        finalKey = self.listKeysFinal.get(ANCHOR)
        modifiers = self.GetModifiers()
        # create a key sequence list for overlap check:
        keySequence = keys.split()
        keysOK = False
        title = 'Key Sequence Error'
        if not keys:
            tkMessageBox.showerror(title=title, parent=self,
                                   message='No keys specified.')
        elif not keys.endswith('>'):
            tkMessageBox.showerror(title=title, parent=self,
                                   message='Missing the final Key')
        elif (not modifiers
              and finalKey not in self.functionKeys + self.moveKeys):
            tkMessageBox.showerror(title=title, parent=self,
                                   message='No modifier key(s) specified.')
        elif (modifiers == ['Shift']) \
                 and (finalKey not in
                      self.functionKeys + self.moveKeys + ('Tab', 'Space')):
            msg = 'The shift modifier by itself may not be used with'\
                  ' this key symbol.'
            tkMessageBox.showerror(title=title, parent=self, message=msg)
        elif keySequence in self.currentKeySequences:
            msg = 'This key combination is already in use.'
            tkMessageBox.showerror(title=title, parent=self, message=msg)
        else:
            keysOK = True
        return keysOK

if __name__ == '__main__':
    from idlelib.idle_test.htest import run
    run(GetKeysDialog)

SILENT KILLER Tool