@@ -449,6 +449,77 @@ def test_unbind_direct_key_default_unbinds_all_direct_keys(self):
449
449
self .assertEqual (len (unbind_call_args ), 4 , 'unbind call count' )
450
450
451
451
452
+ def _event (self , keysym ):
453
+
454
+ event = mock .Mock ()
455
+ event .keysym = keysym
456
+ return event
457
+
458
+
459
+ def test_bind_direct_key_press_and_release (self ):
460
+
461
+ press_cb = mock .Mock ()
462
+ release_cb = mock .Mock ()
463
+ self .w .bind_direct_key ('a' , press_cb , release_cb )
464
+
465
+ # KeyPress event.
466
+ event = self ._event ('a' )
467
+ self .w ._direct_key_press (event )
468
+
469
+ # Press callback called.
470
+ press_cb .assert_called_once ()
471
+ press_cb .assert_called_with (event )
472
+ release_cb .assert_not_called ()
473
+
474
+ press_cb .reset_mock ()
475
+
476
+ # KeyRelease event. Not held down so _direct_key_idle called.
477
+ self .w ._direct_key_release (event )
478
+ self .w ._direct_key_idle (event )
479
+
480
+ # Release callback called.
481
+ press_cb .assert_not_called ()
482
+ release_cb .assert_called_once ()
483
+ release_cb .assert_called_with (event )
484
+
485
+
486
+ def test_bind_direct_key_press_hold_and_release (self ):
487
+
488
+ press_cb = mock .Mock ()
489
+ release_cb = mock .Mock ()
490
+ self .w .bind_direct_key ('a' , press_cb , release_cb )
491
+
492
+ # KeyPress event.
493
+ event = self ._event ('a' )
494
+ self .w ._direct_key_press (event )
495
+
496
+ # Press callback called.
497
+ press_cb .assert_called_once ()
498
+ press_cb .assert_called_with (event )
499
+ release_cb .assert_not_called ()
500
+
501
+ press_cb .reset_mock ()
502
+
503
+ # Holding the key triggers KeyPress/KeyReleases repeatedly.
504
+ # But never idle, so _direct_key_idle never called.
505
+ for _ in range (10 ):
506
+ self .w ._direct_key_release (event )
507
+ self .w ._direct_key_press (event )
508
+
509
+ # No callbacks while key held down.
510
+ press_cb .assert_not_called ()
511
+ release_cb .assert_not_called ()
512
+
513
+ # Last KeyRelease event. Not held down so _direct_key_idle called.
514
+ self .w ._direct_key_release (event )
515
+ self .w ._direct_key_idle (event )
516
+
517
+ # Release callback called.
518
+ press_cb .assert_not_called ()
519
+ release_cb .assert_called_once ()
520
+ release_cb .assert_called_with (event )
521
+
522
+
452
523
453
524
class TestMultipleWindows (FakedTkinterTestCase ):
454
525
0 commit comments