Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions Lib/idlelib/idle_test/test_multicall.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,22 @@ def test_yview(self):
mctext = self.mc(self.root)
self.assertIs(mctext.yview.__func__, Text.yview)

def test_event_delete_unbound_sequence(self):
# gh-89360: deleting a sequence that was not added to a virtual
# event is ignored instead of raising ValueError.
mctext = self.mc(self.root)
mctext.event_add('<<tester>>', '<Control-Key-a>')
info = mctext.event_info('<<tester>>')
self.assertEqual(len(info), 1)

# A different sequence, never added: a no-op, not an error.
mctext.event_delete('<<tester>>', '<Control-Key-b>')
self.assertEqual(mctext.event_info('<<tester>>'), info)

# The added sequence can still be deleted normally.
mctext.event_delete('<<tester>>', '<Control-Key-a>')
self.assertNotIn(info[0], mctext.event_info('<<tester>>'))


if __name__ == '__main__':
unittest.main(verbosity=2)
3 changes: 2 additions & 1 deletion Lib/idlelib/multicall.py
Original file line number Diff line number Diff line change
Expand Up @@ -386,10 +386,11 @@ def event_delete(self, virtual, *sequences):
if triplet is None:
#print("Tkinter event_delete: %s" % seq, file=sys.__stderr__)
widget.event_delete(self, virtual, seq)
else:
elif triplet in triplets:
if func is not None:
self.__binders[triplet[1]].unbind(triplet, func)
triplets.remove(triplet)
# Else the sequence is not bound; ignore it (gh-89360).

def event_info(self, virtual=None):
if virtual is None or virtual not in self.__eventinfo:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fix a rare crash in the IDLE editor when the completion window is closed:
deleting a key binding for a sequence that is not bound to the virtual
event is now ignored instead of raising a ``ValueError``.
Loading