| 
									
										
										
										
											2015-04-22 08:36:03 +03:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | import tkinter | 
					
						
							| 
									
										
										
										
											2011-07-03 21:56:48 -07:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-24 09:07:47 +03:00
										 |  |  | class AbstractTkTest: | 
					
						
							| 
									
										
										
										
											2009-02-02 01:02:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-24 09:07:47 +03:00
										 |  |  |     @classmethod | 
					
						
							|  |  |  |     def setUpClass(cls): | 
					
						
							|  |  |  |         cls._old_support_default_root = tkinter._support_default_root | 
					
						
							|  |  |  |         destroy_default_root() | 
					
						
							|  |  |  |         tkinter.NoDefaultRoot() | 
					
						
							|  |  |  |         cls.root = tkinter.Tk() | 
					
						
							|  |  |  |         cls.wantobjects = cls.root.wantobjects() | 
					
						
							|  |  |  |         # De-maximize main window. | 
					
						
							|  |  |  |         # Some window managers can maximize new windows. | 
					
						
							|  |  |  |         cls.root.wm_state('normal') | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             cls.root.wm_attributes('-zoomed', False) | 
					
						
							|  |  |  |         except tkinter.TclError: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def tearDownClass(cls): | 
					
						
							| 
									
										
										
										
											2014-10-12 20:35:30 +03:00
										 |  |  |         cls.root.update_idletasks() | 
					
						
							| 
									
										
										
										
											2014-08-24 09:07:47 +03:00
										 |  |  |         cls.root.destroy() | 
					
						
							| 
									
										
										
										
											2015-11-10 15:30:35 +02:00
										 |  |  |         del cls.root | 
					
						
							| 
									
										
										
										
											2014-08-24 09:07:47 +03:00
										 |  |  |         tkinter._default_root = None | 
					
						
							|  |  |  |         tkinter._support_default_root = cls._old_support_default_root | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.root.deiconify() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         for w in self.root.winfo_children(): | 
					
						
							|  |  |  |             w.destroy() | 
					
						
							|  |  |  |         self.root.withdraw() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def destroy_default_root(): | 
					
						
							|  |  |  |     if getattr(tkinter, '_default_root', None): | 
					
						
							|  |  |  |         tkinter._default_root.update_idletasks() | 
					
						
							|  |  |  |         tkinter._default_root.destroy() | 
					
						
							|  |  |  |         tkinter._default_root = None | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def simulate_mouse_click(widget, x, y): | 
					
						
							|  |  |  |     """Generate proper events to click at the x, y position (tries to act
 | 
					
						
							|  |  |  |     like an X server)."""
 | 
					
						
							|  |  |  |     widget.event_generate('<Enter>', x=0, y=0) | 
					
						
							|  |  |  |     widget.event_generate('<Motion>', x=x, y=y) | 
					
						
							|  |  |  |     widget.event_generate('<ButtonPress-1>', x=x, y=y) | 
					
						
							|  |  |  |     widget.event_generate('<ButtonRelease-1>', x=x, y=y) | 
					
						
							| 
									
										
										
										
											2013-11-02 10:41:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import _tkinter | 
					
						
							|  |  |  | tcl_version = tuple(map(int, _tkinter.TCL_VERSION.split('.'))) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def requires_tcl(*version): | 
					
						
							|  |  |  |     return unittest.skipUnless(tcl_version >= version, | 
					
						
							|  |  |  |             'requires Tcl version >= ' + '.'.join(map(str, version))) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-09 21:16:19 +02:00
										 |  |  | _tk_patchlevel = None | 
					
						
							|  |  |  | def get_tk_patchlevel(): | 
					
						
							|  |  |  |     global _tk_patchlevel | 
					
						
							|  |  |  |     if _tk_patchlevel is None: | 
					
						
							|  |  |  |         tcl = tkinter.Tcl() | 
					
						
							| 
									
										
										
										
											2015-04-22 08:36:03 +03:00
										 |  |  |         patchlevel = tcl.call('info', 'patchlevel') | 
					
						
							|  |  |  |         m = re.fullmatch(r'(\d+)\.(\d+)([ab.])(\d+)', patchlevel) | 
					
						
							|  |  |  |         major, minor, releaselevel, serial = m.groups() | 
					
						
							|  |  |  |         major, minor, serial = int(major), int(minor), int(serial) | 
					
						
							|  |  |  |         releaselevel = {'a': 'alpha', 'b': 'beta', '.': 'final'}[releaselevel] | 
					
						
							|  |  |  |         if releaselevel == 'final': | 
					
						
							|  |  |  |             _tk_patchlevel = major, minor, serial, releaselevel, 0 | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             _tk_patchlevel = major, minor, 0, releaselevel, serial | 
					
						
							| 
									
										
										
										
											2013-11-09 21:16:19 +02:00
										 |  |  |     return _tk_patchlevel | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-02 10:41:48 +02:00
										 |  |  | units = { | 
					
						
							|  |  |  |     'c': 72 / 2.54,     # centimeters | 
					
						
							|  |  |  |     'i': 72,            # inches | 
					
						
							|  |  |  |     'm': 72 / 25.4,     # millimeters | 
					
						
							|  |  |  |     'p': 1,             # points | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def pixels_conv(value): | 
					
						
							|  |  |  |     return float(value[:-1]) * units[value[-1:]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def tcl_obj_eq(actual, expected): | 
					
						
							|  |  |  |     if actual == expected: | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     if isinstance(actual, _tkinter.Tcl_Obj): | 
					
						
							|  |  |  |         if isinstance(expected, str): | 
					
						
							|  |  |  |             return str(actual) == expected | 
					
						
							|  |  |  |     if isinstance(actual, tuple): | 
					
						
							|  |  |  |         if isinstance(expected, tuple): | 
					
						
							|  |  |  |             return (len(actual) == len(expected) and | 
					
						
							|  |  |  |                     all(tcl_obj_eq(act, exp) | 
					
						
							|  |  |  |                         for act, exp in zip(actual, expected))) | 
					
						
							|  |  |  |     return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def widget_eq(actual, expected): | 
					
						
							|  |  |  |     if actual == expected: | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     if isinstance(actual, (str, tkinter.Widget)): | 
					
						
							|  |  |  |         if isinstance(expected, (str, tkinter.Widget)): | 
					
						
							|  |  |  |             return str(actual) == str(expected) | 
					
						
							|  |  |  |     return False |