@@ -532,6 +532,284 @@ def test_wm_attribute(self):
532
532
1.0 if self .wantobjects else '1.0' )
533
533
534
534
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
+
535
813
class BindTest (AbstractTkTest , unittest .TestCase ):
536
814
537
815
def setUp (self ):
0 commit comments