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)
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: