Skip to content

Commit 0a761ca

Browse files
[3.12] Add Tkinter tests for different events (GH-118778) (GH-119095)
(cherry picked from commit b683994)
1 parent 33a9f0c commit 0a761ca

File tree

1 file changed

+278
-0
lines changed

1 file changed

+278
-0
lines changed

Lib/test/test_tkinter/test_misc.py

Lines changed: 278 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
386664
class BindTest(AbstractTkTest, unittest.TestCase):
387665

388666
def setUp(self):

0 commit comments

Comments
 (0)