Skip to content

Commit c2d2752

Browse files
[3.15] gh-89360: Fix ValueError in IDLE MultiCall event_delete (GH-152738) (#152802)
gh-89360: Fix ValueError in IDLE MultiCall event_delete (GH-152738) Deleting a key binding for a sequence not bound to the virtual event no longer raises a ValueError; the discrepancy is now ignored. (cherry picked from commit ea7619f) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
1 parent 5de11c6 commit c2d2752

3 files changed

Lines changed: 21 additions & 1 deletion

File tree

Lib/idlelib/idle_test/test_multicall.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,22 @@ def test_yview(self):
4343
mctext = self.mc(self.root)
4444
self.assertIs(mctext.yview.__func__, Text.yview)
4545

46+
def test_event_delete_unbound_sequence(self):
47+
# gh-89360: deleting a sequence that was not added to a virtual
48+
# event is ignored instead of raising ValueError.
49+
mctext = self.mc(self.root)
50+
mctext.event_add('<<tester>>', '<Control-Key-a>')
51+
info = mctext.event_info('<<tester>>')
52+
self.assertEqual(len(info), 1)
53+
54+
# A different sequence, never added: a no-op, not an error.
55+
mctext.event_delete('<<tester>>', '<Control-Key-b>')
56+
self.assertEqual(mctext.event_info('<<tester>>'), info)
57+
58+
# The added sequence can still be deleted normally.
59+
mctext.event_delete('<<tester>>', '<Control-Key-a>')
60+
self.assertNotIn(info[0], mctext.event_info('<<tester>>'))
61+
4662

4763
if __name__ == '__main__':
4864
unittest.main(verbosity=2)

Lib/idlelib/multicall.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,10 +386,11 @@ def event_delete(self, virtual, *sequences):
386386
if triplet is None:
387387
#print("Tkinter event_delete: %s" % seq, file=sys.__stderr__)
388388
widget.event_delete(self, virtual, seq)
389-
else:
389+
elif triplet in triplets:
390390
if func is not None:
391391
self.__binders[triplet[1]].unbind(triplet, func)
392392
triplets.remove(triplet)
393+
# Else the sequence is not bound; ignore it (gh-89360).
393394

394395
def event_info(self, virtual=None):
395396
if virtual is None or virtual not in self.__eventinfo:
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix a rare crash in the IDLE editor when the completion window is closed:
2+
deleting a key binding for a sequence that is not bound to the virtual
3+
event is now ignored instead of raising a ``ValueError``.

0 commit comments

Comments
 (0)