@@ -383,6 +383,284 @@ def test_info_patchlevel(self):
383383 self .assertTrue (str (vi ).startswith (f'{ vi .major } .{ vi .minor } ' ))
384384
385385
386+ class EventTest (AbstractTkTest , unittest .TestCase ):
387+
388+ def test_focus (self ):
389+ f = tkinter .Frame (self .root , width = 150 , height = 100 )
390+ f .pack ()
391+ self .root .wait_visibility () # needed on Windows
392+ self .root .update_idletasks ()
393+
394+ events = []
395+ f .bind ('<FocusIn>' , events .append )
396+
397+ f .focus_force ()
398+ self .root .update ()
399+ self .assertEqual (len (events ), 1 , events )
400+ e = events [0 ]
401+ self .assertIs (e .type , tkinter .EventType .FocusIn )
402+ self .assertIs (e .widget , f )
403+ self .assertIsInstance (e .serial , int )
404+ self .assertEqual (e .time , '??' )
405+ self .assertIs (e .send_event , False )
406+ self .assertFalse (hasattr (e , 'focus' ))
407+ self .assertEqual (e .num , '??' )
408+ self .assertEqual (e .state , '??' )
409+ self .assertEqual (e .char , '??' )
410+ self .assertEqual (e .keycode , '??' )
411+ self .assertEqual (e .keysym , '??' )
412+ self .assertEqual (e .keysym_num , '??' )
413+ self .assertEqual (e .width , '??' )
414+ self .assertEqual (e .height , '??' )
415+ self .assertEqual (e .x , '??' )
416+ self .assertEqual (e .y , '??' )
417+ self .assertEqual (e .x_root , '??' )
418+ self .assertEqual (e .y_root , '??' )
419+ self .assertEqual (e .delta , 0 )
420+ self .assertEqual (repr (e ), '<FocusIn event>' )
421+
422+ def test_configure (self ):
423+ f = tkinter .Frame (self .root , width = 150 , height = 100 )
424+ f .pack ()
425+ self .root .wait_visibility () # needed on Windows
426+ self .root .update_idletasks ()
427+
428+ events = []
429+ f .bind ('<Configure>' , events .append )
430+
431+ f .configure (height = 120 , borderwidth = 10 )
432+ self .assertEqual (len (events ), 1 , events )
433+ e = events [0 ]
434+ self .assertIs (e .type , tkinter .EventType .Configure )
435+ self .assertIs (e .widget , f )
436+ self .assertIsInstance (e .serial , int )
437+ self .assertEqual (e .time , '??' )
438+ self .assertIs (e .send_event , False )
439+ self .assertFalse (hasattr (e , 'focus' ))
440+ self .assertEqual (e .num , '??' )
441+ self .assertEqual (e .state , '??' )
442+ self .assertEqual (e .char , '??' )
443+ self .assertEqual (e .keycode , '??' )
444+ self .assertEqual (e .keysym , '??' )
445+ self .assertEqual (e .keysym_num , '??' )
446+ self .assertEqual (e .width , 150 )
447+ self .assertEqual (e .height , 100 )
448+ self .assertEqual (e .x , 0 )
449+ self .assertEqual (e .y , 0 )
450+ self .assertEqual (e .x_root , '??' )
451+ self .assertEqual (e .y_root , '??' )
452+ self .assertEqual (e .delta , 0 )
453+ self .assertEqual (repr (e ), '<Configure event x=0 y=0 width=150 height=100>' )
454+
455+ def test_event_generate_key_press (self ):
456+ f = tkinter .Frame (self .root , width = 150 , height = 100 )
457+ f .pack ()
458+ self .root .wait_visibility () # needed on Windows
459+ self .root .update_idletasks ()
460+
461+ events = []
462+ f .bind ('<KeyPress>' , events .append )
463+ f .focus_force ()
464+
465+ f .event_generate ('<Alt-z>' )
466+ self .assertEqual (len (events ), 1 , events )
467+ e = events [0 ]
468+ self .assertIs (e .type , tkinter .EventType .KeyPress )
469+ self .assertIs (e .widget , f )
470+ self .assertIsInstance (e .serial , int )
471+ self .assertEqual (e .time , 0 )
472+ self .assertIs (e .send_event , False )
473+ self .assertFalse (hasattr (e , 'focus' ))
474+ self .assertEqual (e .num , '??' )
475+ self .assertIsInstance (e .state , int )
476+ self .assertNotEqual (e .state , 0 )
477+ self .assertEqual (e .char , 'z' )
478+ self .assertIsInstance (e .keycode , int )
479+ self .assertNotEqual (e .keycode , 0 )
480+ self .assertEqual (e .keysym , 'z' )
481+ self .assertEqual (e .keysym_num , ord ('z' ))
482+ self .assertEqual (e .width , '??' )
483+ self .assertEqual (e .height , '??' )
484+ self .assertEqual (e .x , - 1 - f .winfo_rootx ())
485+ self .assertEqual (e .y , - 1 - f .winfo_rooty ())
486+ self .assertEqual (e .x_root , - 1 )
487+ self .assertEqual (e .y_root , - 1 )
488+ self .assertEqual (e .delta , 0 )
489+ self .assertEqual (repr (e ),
490+ f"<KeyPress event state={ e .state :#x} "
491+ f"keysym=z keycode={ e .keycode } char='z' x={ e .x } y={ e .y } >" )
492+
493+ def test_event_generate_enter (self ):
494+ f = tkinter .Frame (self .root , width = 150 , height = 100 )
495+ f .pack ()
496+ self .root .wait_visibility () # needed on Windows
497+ self .root .update_idletasks ()
498+
499+ events = []
500+ f .bind ('<Enter>' , events .append )
501+
502+ f .event_generate ('<Enter>' , x = 100 , y = 50 )
503+ self .assertEqual (len (events ), 1 , events )
504+ e = events [0 ]
505+ self .assertIs (e .type , tkinter .EventType .Enter )
506+ self .assertIs (e .widget , f )
507+ self .assertIsInstance (e .serial , int )
508+ self .assertEqual (e .time , 0 )
509+ self .assertIs (e .send_event , False )
510+ self .assertIs (e .focus , False )
511+ self .assertEqual (e .num , '??' )
512+ self .assertEqual (e .state , 0 )
513+ self .assertEqual (e .char , '??' )
514+ self .assertEqual (e .keycode , '??' )
515+ self .assertEqual (e .keysym , '??' )
516+ self .assertEqual (e .keysym_num , '??' )
517+ self .assertEqual (e .width , '??' )
518+ self .assertEqual (e .height , '??' )
519+ self .assertEqual (e .x , 100 )
520+ self .assertEqual (e .y , 50 )
521+ self .assertEqual (e .x_root , 100 + f .winfo_rootx ())
522+ self .assertEqual (e .y_root , 50 + f .winfo_rooty ())
523+ self .assertEqual (e .delta , 0 )
524+ self .assertEqual (repr (e ), '<Enter event focus=False x=100 y=50>' )
525+
526+ def test_event_generate_button_press (self ):
527+ f = tkinter .Frame (self .root , width = 150 , height = 100 )
528+ f .pack ()
529+ self .root .wait_visibility () # needed on Windows
530+ self .root .update_idletasks ()
531+
532+ events = []
533+ f .bind ('<ButtonPress>' , events .append )
534+ f .focus_force ()
535+
536+ f .event_generate ('<Button-1>' , x = 100 , y = 50 )
537+ self .assertEqual (len (events ), 1 , events )
538+ e = events [0 ]
539+ self .assertIs (e .type , tkinter .EventType .ButtonPress )
540+ self .assertIs (e .widget , f )
541+ self .assertIsInstance (e .serial , int )
542+ self .assertEqual (e .time , 0 )
543+ self .assertIs (e .send_event , False )
544+ self .assertFalse (hasattr (e , 'focus' ))
545+ self .assertEqual (e .num , 1 )
546+ self .assertEqual (e .state , 0 )
547+ self .assertEqual (e .char , '??' )
548+ self .assertEqual (e .keycode , '??' )
549+ self .assertEqual (e .keysym , '??' )
550+ self .assertEqual (e .keysym_num , '??' )
551+ self .assertEqual (e .width , '??' )
552+ self .assertEqual (e .height , '??' )
553+ self .assertEqual (e .x , 100 )
554+ self .assertEqual (e .y , 50 )
555+ self .assertEqual (e .x_root , f .winfo_rootx () + 100 )
556+ self .assertEqual (e .y_root , f .winfo_rooty () + 50 )
557+ self .assertEqual (e .delta , 0 )
558+ self .assertEqual (repr (e ), '<ButtonPress event num=1 x=100 y=50>' )
559+
560+ def test_event_generate_motion (self ):
561+ f = tkinter .Frame (self .root , width = 150 , height = 100 )
562+ f .pack ()
563+ self .root .wait_visibility () # needed on Windows
564+ self .root .update_idletasks ()
565+
566+ events = []
567+ f .bind ('<Motion>' , events .append )
568+ f .focus_force ()
569+
570+ f .event_generate ('<B1-Motion>' , x = 100 , y = 50 )
571+ self .assertEqual (len (events ), 1 , events )
572+ e = events [0 ]
573+ self .assertIs (e .type , tkinter .EventType .Motion )
574+ self .assertIs (e .widget , f )
575+ self .assertIsInstance (e .serial , int )
576+ self .assertEqual (e .time , 0 )
577+ self .assertIs (e .send_event , False )
578+ self .assertFalse (hasattr (e , 'focus' ))
579+ self .assertEqual (e .num , '??' )
580+ self .assertEqual (e .state , 0x100 )
581+ self .assertEqual (e .char , '??' )
582+ self .assertEqual (e .keycode , '??' )
583+ self .assertEqual (e .keysym , '??' )
584+ self .assertEqual (e .keysym_num , '??' )
585+ self .assertEqual (e .width , '??' )
586+ self .assertEqual (e .height , '??' )
587+ self .assertEqual (e .x , 100 )
588+ self .assertEqual (e .y , 50 )
589+ self .assertEqual (e .x_root , f .winfo_rootx () + 100 )
590+ self .assertEqual (e .y_root , f .winfo_rooty () + 50 )
591+ self .assertEqual (e .delta , 0 )
592+ self .assertEqual (repr (e ), '<Motion event state=Button1 x=100 y=50>' )
593+
594+ def test_event_generate_mouse_wheel (self ):
595+ f = tkinter .Frame (self .root , width = 150 , height = 100 )
596+ f .pack ()
597+ self .root .wait_visibility () # needed on Windows
598+ self .root .update_idletasks ()
599+
600+ events = []
601+ f .bind ('<MouseWheel>' , events .append )
602+ f .focus_force ()
603+
604+ f .event_generate ('<MouseWheel>' , x = 100 , y = 50 , delta = - 5 )
605+ self .assertEqual (len (events ), 1 , events )
606+ e = events [0 ]
607+ self .assertIs (e .type , tkinter .EventType .MouseWheel )
608+ self .assertIs (e .widget , f )
609+ self .assertIsInstance (e .serial , int )
610+ self .assertIs (e .send_event , False )
611+ self .assertFalse (hasattr (e , 'focus' ))
612+ self .assertEqual (e .time , 0 )
613+ self .assertEqual (e .num , '??' )
614+ self .assertEqual (e .state , 0 )
615+ self .assertEqual (e .char , '??' )
616+ self .assertEqual (e .keycode , '??' )
617+ self .assertEqual (e .keysym , '??' )
618+ self .assertEqual (e .keysym_num , '??' )
619+ self .assertEqual (e .width , '??' )
620+ self .assertEqual (e .height , '??' )
621+ self .assertEqual (e .x , 100 )
622+ self .assertEqual (e .y , 50 )
623+ self .assertEqual (e .x_root , f .winfo_rootx () + 100 )
624+ self .assertEqual (e .y_root , f .winfo_rooty () + 50 )
625+ self .assertEqual (e .delta , - 5 )
626+ self .assertEqual (repr (e ), '<MouseWheel event delta=-5 x=100 y=50>' )
627+
628+ def test_generate_event_virtual_event (self ):
629+ f = tkinter .Frame (self .root , width = 150 , height = 100 )
630+ f .pack ()
631+ self .root .wait_visibility () # needed on Windows
632+ self .root .update_idletasks ()
633+
634+ events = []
635+ f .bind ('<<Spam>>' , events .append )
636+ f .focus_force ()
637+
638+ f .event_generate ('<<Spam>>' , x = 50 )
639+ self .assertEqual (len (events ), 1 , events )
640+ e = events [0 ]
641+ self .assertIs (e .type , tkinter .EventType .VirtualEvent )
642+ self .assertIs (e .widget , f )
643+ self .assertIsInstance (e .serial , int )
644+ self .assertEqual (e .time , 0 )
645+ self .assertIs (e .send_event , False )
646+ self .assertFalse (hasattr (e , 'focus' ))
647+ self .assertEqual (e .num , '??' )
648+ self .assertEqual (e .state , 0 )
649+ self .assertEqual (e .char , '??' )
650+ self .assertEqual (e .keycode , '??' )
651+ self .assertEqual (e .keysym , '??' )
652+ self .assertEqual (e .keysym_num , '??' )
653+ self .assertEqual (e .width , '??' )
654+ self .assertEqual (e .height , '??' )
655+ self .assertEqual (e .x , 50 )
656+ self .assertEqual (e .y , 0 )
657+ self .assertEqual (e .x_root , f .winfo_rootx () + 50 )
658+ self .assertEqual (e .y_root , - 1 )
659+ self .assertEqual (e .delta , 0 )
660+ self .assertEqual (repr (e ),
661+ f"<VirtualEvent event x=50 y=0>" )
662+
663+
386664class BindTest (AbstractTkTest , unittest .TestCase ):
387665
388666 def setUp (self ):
0 commit comments