summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-10-24 10:02:12 (GMT)
committerGitHub <noreply@github.com>2023-10-24 10:02:12 (GMT)
commit9bb202a1a90ef0edce20c495c9426d9766df11bb (patch)
tree1823a6914951b9fa5253d4849350096126c81e22
parentb8c20f90492f9ef2c4600e2739f8e871a31b93c3 (diff)
downloadcpython-9bb202a1a90ef0edce20c495c9426d9766df11bb.zip
cpython-9bb202a1a90ef0edce20c495c9426d9766df11bb.tar.gz
cpython-9bb202a1a90ef0edce20c495c9426d9766df11bb.tar.bz2
gh-75666: Tkinter: add tests for binding (GH-111202)
-rw-r--r--Lib/test/test_tkinter/test_misc.py307
1 files changed, 307 insertions, 0 deletions
diff --git a/Lib/test/test_tkinter/test_misc.py b/Lib/test/test_tkinter/test_misc.py
index 0ae2761..ca99caa 100644
--- a/Lib/test/test_tkinter/test_misc.py
+++ b/Lib/test/test_tkinter/test_misc.py
@@ -425,6 +425,309 @@ class MiscTest(AbstractTkTest, unittest.TestCase):
self.assertTrue(str(vi).startswith(f'{vi.major}.{vi.minor}'))
+class BindTest(AbstractTkTest, unittest.TestCase):
+
+ def setUp(self):
+ super().setUp()
+ root = self.root
+ self.frame = tkinter.Frame(self.root, class_='Test',
+ width=150, height=100)
+ self.frame.pack()
+
+ def assertCommandExist(self, funcid):
+ self.assertEqual(_info_commands(self.root, funcid), (funcid,))
+
+ def assertCommandNotExist(self, funcid):
+ self.assertEqual(_info_commands(self.root, funcid), ())
+
+ def test_bind(self):
+ event = '<Control-Alt-Key-a>'
+ f = self.frame
+ self.assertEqual(f.bind(), ())
+ self.assertEqual(f.bind(event), '')
+ def test1(e): pass
+ def test2(e): pass
+
+ funcid = f.bind(event, test1)
+ self.assertEqual(f.bind(), (event,))
+ script = f.bind(event)
+ self.assertIn(funcid, script)
+ self.assertCommandExist(funcid)
+
+ funcid2 = f.bind(event, test2, add=True)
+ script = f.bind(event)
+ self.assertIn(funcid, script)
+ self.assertIn(funcid2, script)
+ self.assertCommandExist(funcid)
+ self.assertCommandExist(funcid2)
+
+ def test_unbind(self):
+ event = '<Control-Alt-Key-b>'
+ f = self.frame
+ self.assertEqual(f.bind(), ())
+ self.assertEqual(f.bind(event), '')
+ def test1(e): pass
+ def test2(e): pass
+
+ funcid = f.bind(event, test1)
+ funcid2 = f.bind(event, test2, add=True)
+
+ self.assertRaises(TypeError, f.unbind)
+ f.unbind(event)
+ self.assertEqual(f.bind(event), '')
+ self.assertEqual(f.bind(), ())
+
+ def test_unbind2(self):
+ f = self.frame
+ event = '<Control-Alt-Key-c>'
+ self.assertEqual(f.bind(), ())
+ self.assertEqual(f.bind(event), '')
+ def test1(e): pass
+ def test2(e): pass
+
+ funcid = f.bind(event, test1)
+ funcid2 = f.bind(event, test2, add=True)
+
+ f.unbind(event, funcid)
+ script = f.bind(event)
+ self.assertNotIn(funcid, script)
+ self.assertCommandNotExist(funcid)
+ self.assertCommandExist(funcid2)
+
+ f.unbind(event, funcid2)
+ self.assertEqual(f.bind(event), '')
+ self.assertEqual(f.bind(), ())
+ self.assertCommandNotExist(funcid)
+ self.assertCommandNotExist(funcid2)
+
+ # non-idempotent
+ self.assertRaises(tkinter.TclError, f.unbind, event, funcid2)
+
+ def test_bind_rebind(self):
+ event = '<Control-Alt-Key-d>'
+ f = self.frame
+ self.assertEqual(f.bind(), ())
+ self.assertEqual(f.bind(event), '')
+ def test1(e): pass
+ def test2(e): pass
+ def test3(e): pass
+
+ funcid = f.bind(event, test1)
+ funcid2 = f.bind(event, test2, add=True)
+ script = f.bind(event)
+ self.assertIn(funcid2, script)
+ self.assertIn(funcid, script)
+ self.assertCommandExist(funcid)
+ self.assertCommandExist(funcid2)
+
+ funcid3 = f.bind(event, test3)
+ script = f.bind(event)
+ self.assertNotIn(funcid, script)
+ self.assertNotIn(funcid2, script)
+ self.assertIn(funcid3, script)
+ self.assertCommandExist(funcid3)
+
+ def test_bind_class(self):
+ event = '<Control-Alt-Key-e>'
+ bind_class = self.root.bind_class
+ unbind_class = self.root.unbind_class
+ self.assertRaises(TypeError, bind_class)
+ self.assertEqual(bind_class('Test'), ())
+ self.assertEqual(bind_class('Test', event), '')
+ self.addCleanup(unbind_class, 'Test', event)
+ def test1(e): pass
+ def test2(e): pass
+
+ funcid = bind_class('Test', event, test1)
+ self.assertEqual(bind_class('Test'), (event,))
+ script = bind_class('Test', event)
+ self.assertIn(funcid, script)
+ self.assertCommandExist(funcid)
+
+ funcid2 = bind_class('Test', event, test2, add=True)
+ script = bind_class('Test', event)
+ self.assertIn(funcid, script)
+ self.assertIn(funcid2, script)
+ self.assertCommandExist(funcid)
+ self.assertCommandExist(funcid2)
+
+ def test_unbind_class(self):
+ event = '<Control-Alt-Key-f>'
+ bind_class = self.root.bind_class
+ unbind_class = self.root.unbind_class
+ self.assertEqual(bind_class('Test'), ())
+ self.assertEqual(bind_class('Test', event), '')
+ self.addCleanup(unbind_class, 'Test', event)
+ def test1(e): pass
+ def test2(e): pass
+
+ funcid = bind_class('Test', event, test1)
+ funcid2 = bind_class('Test', event, test2, add=True)
+
+ self.assertRaises(TypeError, unbind_class)
+ self.assertRaises(TypeError, unbind_class, 'Test')
+ unbind_class('Test', event)
+ self.assertEqual(bind_class('Test', event), '')
+ self.assertEqual(bind_class('Test'), ())
+ self.assertCommandExist(funcid)
+ self.assertCommandExist(funcid2)
+
+ unbind_class('Test', event) # idempotent
+
+ def test_bind_class_rebind(self):
+ event = '<Control-Alt-Key-g>'
+ bind_class = self.root.bind_class
+ unbind_class = self.root.unbind_class
+ self.assertEqual(bind_class('Test'), ())
+ self.assertEqual(bind_class('Test', event), '')
+ self.addCleanup(unbind_class, 'Test', event)
+ def test1(e): pass
+ def test2(e): pass
+ def test3(e): pass
+
+ funcid = bind_class('Test', event, test1)
+ funcid2 = bind_class('Test', event, test2, add=True)
+ script = bind_class('Test', event)
+ self.assertIn(funcid2, script)
+ self.assertIn(funcid, script)
+ self.assertCommandExist(funcid)
+ self.assertCommandExist(funcid2)
+
+ funcid3 = bind_class('Test', event, test3)
+ script = bind_class('Test', event)
+ self.assertNotIn(funcid, script)
+ self.assertNotIn(funcid2, script)
+ self.assertIn(funcid3, script)
+ self.assertCommandExist(funcid)
+ self.assertCommandExist(funcid2)
+ self.assertCommandExist(funcid3)
+
+ def test_bind_all(self):
+ event = '<Control-Alt-Key-h>'
+ bind_all = self.root.bind_all
+ unbind_all = self.root.unbind_all
+ self.assertNotIn(event, bind_all())
+ self.assertEqual(bind_all(event), '')
+ self.addCleanup(unbind_all, event)
+ def test1(e): pass
+ def test2(e): pass
+
+ funcid = bind_all(event, test1)
+ self.assertIn(event, bind_all())
+ script = bind_all(event)
+ self.assertIn(funcid, script)
+ self.assertCommandExist(funcid)
+
+ funcid2 = bind_all(event, test2, add=True)
+ script = bind_all(event)
+ self.assertIn(funcid, script)
+ self.assertIn(funcid2, script)
+ self.assertCommandExist(funcid)
+ self.assertCommandExist(funcid2)
+
+ def test_unbind_all(self):
+ event = '<Control-Alt-Key-i>'
+ bind_all = self.root.bind_all
+ unbind_all = self.root.unbind_all
+ self.assertNotIn(event, bind_all())
+ self.assertEqual(bind_all(event), '')
+ self.addCleanup(unbind_all, event)
+ def test1(e): pass
+ def test2(e): pass
+
+ funcid = bind_all(event, test1)
+ funcid2 = bind_all(event, test2, add=True)
+
+ unbind_all(event)
+ self.assertEqual(bind_all(event), '')
+ self.assertNotIn(event, bind_all())
+ self.assertCommandExist(funcid)
+ self.assertCommandExist(funcid2)
+
+ unbind_all(event) # idempotent
+
+ def test_bind_all_rebind(self):
+ event = '<Control-Alt-Key-j>'
+ bind_all = self.root.bind_all
+ unbind_all = self.root.unbind_all
+ self.assertNotIn(event, bind_all())
+ self.assertEqual(bind_all(event), '')
+ self.addCleanup(unbind_all, event)
+ def test1(e): pass
+ def test2(e): pass
+ def test3(e): pass
+
+ funcid = bind_all(event, test1)
+ funcid2 = bind_all(event, test2, add=True)
+ script = bind_all(event)
+ self.assertIn(funcid2, script)
+ self.assertIn(funcid, script)
+ self.assertCommandExist(funcid)
+ self.assertCommandExist(funcid2)
+
+ funcid3 = bind_all(event, test3)
+ script = bind_all(event)
+ self.assertNotIn(funcid, script)
+ self.assertNotIn(funcid2, script)
+ self.assertIn(funcid3, script)
+ self.assertCommandExist(funcid)
+ self.assertCommandExist(funcid2)
+ self.assertCommandExist(funcid3)
+
+ def test_bindtags(self):
+ f = self.frame
+ self.assertEqual(self.root.bindtags(), ('.', 'Tk', 'all'))
+ self.assertEqual(f.bindtags(), (str(f), 'Test', '.', 'all'))
+ f.bindtags(('a', 'b c'))
+ self.assertEqual(f.bindtags(), ('a', 'b c'))
+
+ def test_bind_events(self):
+ event = '<Enter>'
+ root = self.root
+ t = tkinter.Toplevel(root)
+ f = tkinter.Frame(t, class_='Test', width=150, height=100)
+ f.pack()
+ root.wait_visibility() # needed on Windows
+ root.update_idletasks()
+ self.addCleanup(root.unbind_class, 'Test', event)
+ self.addCleanup(root.unbind_class, 'Toplevel', event)
+ self.addCleanup(root.unbind_class, 'tag', event)
+ self.addCleanup(root.unbind_class, 'tag2', event)
+ self.addCleanup(root.unbind_all, event)
+ def test(what):
+ return lambda e: events.append((what, e.widget))
+
+ root.bind_all(event, test('all'))
+ root.bind_class('Test', event, test('frame class'))
+ root.bind_class('Toplevel', event, test('toplevel class'))
+ root.bind_class('tag', event, test('tag'))
+ root.bind_class('tag2', event, test('tag2'))
+ f.bind(event, test('frame'))
+ t.bind(event, test('toplevel'))
+
+ events = []
+ f.event_generate(event)
+ self.assertEqual(events, [
+ ('frame', f),
+ ('frame class', f),
+ ('toplevel', f),
+ ('all', f),
+ ])
+
+ events = []
+ t.event_generate(event)
+ self.assertEqual(events, [
+ ('toplevel', t),
+ ('toplevel class', t),
+ ('all', t),
+ ])
+
+ f.bindtags(('tag', 'tag3'))
+ events = []
+ f.event_generate(event)
+ self.assertEqual(events, [('tag', f)])
+
+
class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase):
def test_default_root(self):
@@ -480,5 +783,9 @@ class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase):
self.assertRaises(RuntimeError, tkinter.mainloop)
+def _info_commands(widget, pattern=None):
+ return widget.tk.splitlist(widget.tk.call('info', 'commands', pattern))
+
+
if __name__ == "__main__":
unittest.main()