@@ -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+
535813class BindTest (AbstractTkTest , unittest .TestCase ):
536814
537815 def setUp (self ):
0 commit comments