Skip to content

Commit 8a4730e

Browse files
[3.13] Add Tkinter tests for different events (GH-118778) (GH-119091)
(cherry picked from commit b683994) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent 1dc7fcd commit 8a4730e

File tree

1 file changed

+278
-0
lines changed

1 file changed

+278
-0
lines changed

Lib/test/test_tkinter/test_misc.py

+278
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,284 @@ def test_wm_attribute(self):
532532
1.0 if self.wantobjects else '1.0')
533533

534534

535+
class EventTest(AbstractTkTest, unittest.TestCase):
536+
537+
def test_focus(self):
538+
f = tkinter.Frame(self.root, width=150, height=100)
539+
f.pack()
540+
self.root.wait_visibility() # needed on Windows
541+
self.root.update_idletasks()
542+
543+
events = []
544+
f.bind('<FocusIn>', events.append)
545+
546+
f.focus_force()
547+
self.root.update()
548+
self.assertEqual(len(events), 1, events)
549+
e = events[0]
550+
self.assertIs(e.type, tkinter.EventType.FocusIn)
551+
self.assertIs(e.widget, f)
552+
self.assertIsInstance(e.serial, int)
553+
self.assertEqual(e.time, '??')
554+
self.assertIs(e.send_event, False)
555+
self.assertFalse(hasattr(e, 'focus'))
556+
self.assertEqual(e.num, '??')
557+
self.assertEqual(e.state, '??')
558+
self.assertEqual(e.char, '??')
559+
self.assertEqual(e.keycode, '??')
560+
self.assertEqual(e.keysym, '??')
561+
self.assertEqual(e.keysym_num, '??')
562+
self.assertEqual(e.width, '??')
563+
self.assertEqual(e.height, '??')
564+
self.assertEqual(e.x, '??')
565+
self.assertEqual(e.y, '??')
566+
self.assertEqual(e.x_root, '??')
567+
self.assertEqual(e.y_root, '??')
568+
self.assertEqual(e.delta, 0)
569+
self.assertEqual(repr(e), '<FocusIn event>')
570+
571+
def test_configure(self):
572+
f = tkinter.Frame(self.root, width=150, height=100)
573+
f.pack()
574+
self.root.wait_visibility() # needed on Windows
575+
self.root.update_idletasks()
576+
577+
events = []
578+
f.bind('<Configure>', events.append)
579+
580+
f.configure(height=120, borderwidth=10)
581+
self.assertEqual(len(events), 1, events)
582+
e = events[0]
583+
self.assertIs(e.type, tkinter.EventType.Configure)
584+
self.assertIs(e.widget, f)
585+
self.assertIsInstance(e.serial, int)
586+
self.assertEqual(e.time, '??')
587+
self.assertIs(e.send_event, False)
588+
self.assertFalse(hasattr(e, 'focus'))
589+
self.assertEqual(e.num, '??')
590+
self.assertEqual(e.state, '??')
591+
self.assertEqual(e.char, '??')
592+
self.assertEqual(e.keycode, '??')
593+
self.assertEqual(e.keysym, '??')
594+
self.assertEqual(e.keysym_num, '??')
595+
self.assertEqual(e.width, 150)
596+
self.assertEqual(e.height, 100)
597+
self.assertEqual(e.x, 0)
598+
self.assertEqual(e.y, 0)
599+
self.assertEqual(e.x_root, '??')
600+
self.assertEqual(e.y_root, '??')
601+
self.assertEqual(e.delta, 0)
602+
self.assertEqual(repr(e), '<Configure event x=0 y=0 width=150 height=100>')
603+
604+
def test_event_generate_key_press(self):
605+
f = tkinter.Frame(self.root, width=150, height=100)
606+
f.pack()
607+
self.root.wait_visibility() # needed on Windows
608+
self.root.update_idletasks()
609+
610+
events = []
611+
f.bind('<KeyPress>', events.append)
612+
f.focus_force()
613+
614+
f.event_generate('<Alt-z>')
615+
self.assertEqual(len(events), 1, events)
616+
e = events[0]
617+
self.assertIs(e.type, tkinter.EventType.KeyPress)
618+
self.assertIs(e.widget, f)
619+
self.assertIsInstance(e.serial, int)
620+
self.assertEqual(e.time, 0)
621+
self.assertIs(e.send_event, False)
622+
self.assertFalse(hasattr(e, 'focus'))
623+
self.assertEqual(e.num, '??')
624+
self.assertIsInstance(e.state, int)
625+
self.assertNotEqual(e.state, 0)
626+
self.assertEqual(e.char, 'z')
627+
self.assertIsInstance(e.keycode, int)
628+
self.assertNotEqual(e.keycode, 0)
629+
self.assertEqual(e.keysym, 'z')
630+
self.assertEqual(e.keysym_num, ord('z'))
631+
self.assertEqual(e.width, '??')
632+
self.assertEqual(e.height, '??')
633+
self.assertEqual(e.x, -1 - f.winfo_rootx())
634+
self.assertEqual(e.y, -1 - f.winfo_rooty())
635+
self.assertEqual(e.x_root, -1)
636+
self.assertEqual(e.y_root, -1)
637+
self.assertEqual(e.delta, 0)
638+
self.assertEqual(repr(e),
639+
f"<KeyPress event state={e.state:#x} "
640+
f"keysym=z keycode={e.keycode} char='z' x={e.x} y={e.y}>")
641+
642+
def test_event_generate_enter(self):
643+
f = tkinter.Frame(self.root, width=150, height=100)
644+
f.pack()
645+
self.root.wait_visibility() # needed on Windows
646+
self.root.update_idletasks()
647+
648+
events = []
649+
f.bind('<Enter>', events.append)
650+
651+
f.event_generate('<Enter>', x=100, y=50)
652+
self.assertEqual(len(events), 1, events)
653+
e = events[0]
654+
self.assertIs(e.type, tkinter.EventType.Enter)
655+
self.assertIs(e.widget, f)
656+
self.assertIsInstance(e.serial, int)
657+
self.assertEqual(e.time, 0)
658+
self.assertIs(e.send_event, False)
659+
self.assertIs(e.focus, False)
660+
self.assertEqual(e.num, '??')
661+
self.assertEqual(e.state, 0)
662+
self.assertEqual(e.char, '??')
663+
self.assertEqual(e.keycode, '??')
664+
self.assertEqual(e.keysym, '??')
665+
self.assertEqual(e.keysym_num, '??')
666+
self.assertEqual(e.width, '??')
667+
self.assertEqual(e.height, '??')
668+
self.assertEqual(e.x, 100)
669+
self.assertEqual(e.y, 50)
670+
self.assertEqual(e.x_root, 100 + f.winfo_rootx())
671+
self.assertEqual(e.y_root, 50 + f.winfo_rooty())
672+
self.assertEqual(e.delta, 0)
673+
self.assertEqual(repr(e), '<Enter event focus=False x=100 y=50>')
674+
675+
def test_event_generate_button_press(self):
676+
f = tkinter.Frame(self.root, width=150, height=100)
677+
f.pack()
678+
self.root.wait_visibility() # needed on Windows
679+
self.root.update_idletasks()
680+
681+
events = []
682+
f.bind('<ButtonPress>', events.append)
683+
f.focus_force()
684+
685+
f.event_generate('<Button-1>', x=100, y=50)
686+
self.assertEqual(len(events), 1, events)
687+
e = events[0]
688+
self.assertIs(e.type, tkinter.EventType.ButtonPress)
689+
self.assertIs(e.widget, f)
690+
self.assertIsInstance(e.serial, int)
691+
self.assertEqual(e.time, 0)
692+
self.assertIs(e.send_event, False)
693+
self.assertFalse(hasattr(e, 'focus'))
694+
self.assertEqual(e.num, 1)
695+
self.assertEqual(e.state, 0)
696+
self.assertEqual(e.char, '??')
697+
self.assertEqual(e.keycode, '??')
698+
self.assertEqual(e.keysym, '??')
699+
self.assertEqual(e.keysym_num, '??')
700+
self.assertEqual(e.width, '??')
701+
self.assertEqual(e.height, '??')
702+
self.assertEqual(e.x, 100)
703+
self.assertEqual(e.y, 50)
704+
self.assertEqual(e.x_root, f.winfo_rootx() + 100)
705+
self.assertEqual(e.y_root, f.winfo_rooty() + 50)
706+
self.assertEqual(e.delta, 0)
707+
self.assertEqual(repr(e), '<ButtonPress event num=1 x=100 y=50>')
708+
709+
def test_event_generate_motion(self):
710+
f = tkinter.Frame(self.root, width=150, height=100)
711+
f.pack()
712+
self.root.wait_visibility() # needed on Windows
713+
self.root.update_idletasks()
714+
715+
events = []
716+
f.bind('<Motion>', events.append)
717+
f.focus_force()
718+
719+
f.event_generate('<B1-Motion>', x=100, y=50)
720+
self.assertEqual(len(events), 1, events)
721+
e = events[0]
722+
self.assertIs(e.type, tkinter.EventType.Motion)
723+
self.assertIs(e.widget, f)
724+
self.assertIsInstance(e.serial, int)
725+
self.assertEqual(e.time, 0)
726+
self.assertIs(e.send_event, False)
727+
self.assertFalse(hasattr(e, 'focus'))
728+
self.assertEqual(e.num, '??')
729+
self.assertEqual(e.state, 0x100)
730+
self.assertEqual(e.char, '??')
731+
self.assertEqual(e.keycode, '??')
732+
self.assertEqual(e.keysym, '??')
733+
self.assertEqual(e.keysym_num, '??')
734+
self.assertEqual(e.width, '??')
735+
self.assertEqual(e.height, '??')
736+
self.assertEqual(e.x, 100)
737+
self.assertEqual(e.y, 50)
738+
self.assertEqual(e.x_root, f.winfo_rootx() + 100)
739+
self.assertEqual(e.y_root, f.winfo_rooty() + 50)
740+
self.assertEqual(e.delta, 0)
741+
self.assertEqual(repr(e), '<Motion event state=Button1 x=100 y=50>')
742+
743+
def test_event_generate_mouse_wheel(self):
744+
f = tkinter.Frame(self.root, width=150, height=100)
745+
f.pack()
746+
self.root.wait_visibility() # needed on Windows
747+
self.root.update_idletasks()
748+
749+
events = []
750+
f.bind('<MouseWheel>', events.append)
751+
f.focus_force()
752+
753+
f.event_generate('<MouseWheel>', x=100, y=50, delta=-5)
754+
self.assertEqual(len(events), 1, events)
755+
e = events[0]
756+
self.assertIs(e.type, tkinter.EventType.MouseWheel)
757+
self.assertIs(e.widget, f)
758+
self.assertIsInstance(e.serial, int)
759+
self.assertIs(e.send_event, False)
760+
self.assertFalse(hasattr(e, 'focus'))
761+
self.assertEqual(e.time, 0)
762+
self.assertEqual(e.num, '??')
763+
self.assertEqual(e.state, 0)
764+
self.assertEqual(e.char, '??')
765+
self.assertEqual(e.keycode, '??')
766+
self.assertEqual(e.keysym, '??')
767+
self.assertEqual(e.keysym_num, '??')
768+
self.assertEqual(e.width, '??')
769+
self.assertEqual(e.height, '??')
770+
self.assertEqual(e.x, 100)
771+
self.assertEqual(e.y, 50)
772+
self.assertEqual(e.x_root, f.winfo_rootx() + 100)
773+
self.assertEqual(e.y_root, f.winfo_rooty() + 50)
774+
self.assertEqual(e.delta, -5)
775+
self.assertEqual(repr(e), '<MouseWheel event delta=-5 x=100 y=50>')
776+
777+
def test_generate_event_virtual_event(self):
778+
f = tkinter.Frame(self.root, width=150, height=100)
779+
f.pack()
780+
self.root.wait_visibility() # needed on Windows
781+
self.root.update_idletasks()
782+
783+
events = []
784+
f.bind('<<Spam>>', events.append)
785+
f.focus_force()
786+
787+
f.event_generate('<<Spam>>', x=50)
788+
self.assertEqual(len(events), 1, events)
789+
e = events[0]
790+
self.assertIs(e.type, tkinter.EventType.VirtualEvent)
791+
self.assertIs(e.widget, f)
792+
self.assertIsInstance(e.serial, int)
793+
self.assertEqual(e.time, 0)
794+
self.assertIs(e.send_event, False)
795+
self.assertFalse(hasattr(e, 'focus'))
796+
self.assertEqual(e.num, '??')
797+
self.assertEqual(e.state, 0)
798+
self.assertEqual(e.char, '??')
799+
self.assertEqual(e.keycode, '??')
800+
self.assertEqual(e.keysym, '??')
801+
self.assertEqual(e.keysym_num, '??')
802+
self.assertEqual(e.width, '??')
803+
self.assertEqual(e.height, '??')
804+
self.assertEqual(e.x, 50)
805+
self.assertEqual(e.y, 0)
806+
self.assertEqual(e.x_root, f.winfo_rootx() + 50)
807+
self.assertEqual(e.y_root, -1)
808+
self.assertEqual(e.delta, 0)
809+
self.assertEqual(repr(e),
810+
f"<VirtualEvent event x=50 y=0>")
811+
812+
535813
class BindTest(AbstractTkTest, unittest.TestCase):
536814

537815
def setUp(self):

0 commit comments

Comments
 (0)