diff -r 52f68c95e025 Lib/idlelib/configHandler.py --- a/Lib/idlelib/configHandler.py Thu Jan 26 08:47:27 2012 -0600 +++ b/Lib/idlelib/configHandler.py Sat Jan 28 14:36:59 2012 -0600 @@ -19,6 +19,7 @@ """ import os import sys +import tkinter from idlelib import macosxSupport from configparser import ConfigParser, NoOptionError, NoSectionError @@ -521,7 +522,57 @@ if v != v2: result[k] = v2 - return result + return self.ValidateKeys(result) + + def ValidateKeys(self, keyset): + """ Go through the dictionary of keys and make sure each is valid """ + tk = tkinter.Tk() + tk.withdraw() + + total_invalid = [] + for event, keylist in keyset.items(): + invalid = [] + for key in keylist: + try: + tk.bind(key, lambda e: "break") + except: + invalid.append((event, key)) + for _event, key in invalid: + # IDLE's architecute as of 2012-01-28 calls GetCurrentKeySet for each loaded extension, + # hence, this message will print several times. + print(' IDLE Configuration Error: removing invalid key for event %s: %s' % (_event, key), + file=sys.stderr) + keylist.remove(key) + + total_invalid.extend(invalid) + + self._keybinding_error(total_invalid) + + tk.destroy() + return keyset + + def _keybinding_error(self, invalid): + if not hasattr(self, "known_invalid"): + self.known_invalid = [] + known_invalid = self.known_invalid + + # Give the user an error message based on newly found invalid keybindings + new_invalid = [i for i in invalid if i not in known_invalid] + known_invalid.extend(new_invalid) + + if new_invalid: + #print('Newly invalid:', new_invalid) + msg = ['There are invalid key bindings:', ''] + for ev, key in new_invalid: + while ev[0] == '<' and ev[-1] == '>': + ev = ev[1:-1] + msg.append('Action:%s' % ev) + msg.append('Key:%s' % key) + msg.append('') + + msg.extend(['Please reconfigure these bindings in the configuration dialog.']) + tkinter.messagebox.showerror(title='IDLE: Invalid Key Binding Error', + message='\n'.join(msg)) def GetKeySet(self,keySetName): """