@@ -383,6 +383,284 @@ def test_info_patchlevel(self):
383
383
self .assertTrue (str (vi ).startswith (f'{ vi .major } .{ vi .minor } ' ))
384
384
385
385
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
+
386
664
class BindTest (AbstractTkTest , unittest .TestCase ):
387
665
388
666
def setUp (self ):
0 commit comments