Skip to content

Commit 2947118

Browse files
gh-55646: Name the action and suggest reconfiguring in the warning
1 parent e45eed3 commit 2947118

2 files changed

Lines changed: 18 additions & 7 deletions

File tree

Lib/idlelib/idle_test/test_multicall.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ def test_invalid_triplet_binding(self):
5858
with captured_stderr() as stderr:
5959
mctext.event_add('<<test-bad>>', '<Control-Key-up>') # Must not raise.
6060
mctext.bind('<<test-bad>>', lambda e: None) # Must not raise.
61-
self.assertIn('invalid key binding', stderr.getvalue())
61+
warning = stderr.getvalue()
62+
self.assertIn('invalid key binding', warning)
63+
self.assertIn('test-bad', warning) # The offending action is named.
6264

6365
def test_invalid_nontriplet_binding(self):
6466
# gh-55646: '<Foo-Key-Up>' has no valid modifier, so MultiCall does not
@@ -67,7 +69,10 @@ def test_invalid_nontriplet_binding(self):
6769
with captured_stderr() as stderr:
6870
mctext.event_add('<<test-bad>>', '<Foo-Key-Up>') # Must not raise.
6971
mctext.bind('<<test-bad>>', lambda e: None) # Must not raise.
70-
self.assertIn('invalid key binding', stderr.getvalue())
72+
warning = stderr.getvalue()
73+
self.assertIn('invalid key binding', warning)
74+
self.assertIn('test-bad', warning) # The offending action is named.
75+
7176
def test_event_delete_unbound_sequence(self):
7277
# gh-89360: deleting a sequence that was not added to a virtual
7378
# event is ignored instead of raising ValueError.

Lib/idlelib/multicall.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -311,9 +311,13 @@ def _triplet_to_sequence(triplet):
311311
return '<'+_state_names[triplet[0]]+_types[triplet[1]][0]+'>'
312312

313313

314-
def _warn_bad_binding(sequence, err):
314+
def _warn_bad_binding(virtual, sequence, err):
315315
# gh-55646: warn instead of crashing on an invalid key binding.
316-
print(f'Warning: ignoring invalid key binding {sequence!r}: {err}',
316+
action = virtual[2:-2] if virtual[:2] == '<<' and virtual[-2:] == '>>' \
317+
else virtual
318+
print(f'Warning: ignoring invalid key binding {sequence!r} '
319+
f'for {action!r}: {err}. '
320+
f'Please reconfigure it in the IDLE Settings dialog.',
317321
file=sys.stderr)
318322

319323

@@ -355,7 +359,8 @@ def bind(self, sequence=None, func=None, add=None):
355359
try:
356360
self.__binders[triplet[1]].bind(triplet, func)
357361
except tkinter.TclError as err:
358-
_warn_bad_binding(_triplet_to_sequence(triplet),
362+
_warn_bad_binding(sequence,
363+
_triplet_to_sequence(triplet),
359364
err)
360365
bad.append(triplet)
361366
for triplet in bad: # Drop the invalid sequences.
@@ -389,14 +394,15 @@ def event_add(self, virtual, *sequences):
389394
try:
390395
widget.event_add(self, virtual, seq)
391396
except tkinter.TclError as err:
392-
_warn_bad_binding(seq, err)
397+
_warn_bad_binding(virtual, seq, err)
393398
continue # Drop the invalid sequence.
394399
else:
395400
if func is not None:
396401
try:
397402
self.__binders[triplet[1]].bind(triplet, func)
398403
except tkinter.TclError as err:
399-
_warn_bad_binding(_triplet_to_sequence(triplet), err)
404+
_warn_bad_binding(virtual,
405+
_triplet_to_sequence(triplet), err)
400406
continue # Drop the invalid sequence.
401407
triplets.append(triplet)
402408

0 commit comments

Comments
 (0)