mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	* When called with a single argument to get a value, it allow to omit the minus prefix. * It can be called with keyword arguments to set attributes. * w.wm_attributes(return_python_dict=True) returns a dict instead of a tuple (it will be the default in future). * Setting wantobjects to 0 no longer affects the result.
		
			
				
	
	
		
			134 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import functools
 | 
						|
import tkinter
 | 
						|
 | 
						|
class AbstractTkTest:
 | 
						|
 | 
						|
    @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):
 | 
						|
        cls.root.update_idletasks()
 | 
						|
        cls.root.destroy()
 | 
						|
        del cls.root
 | 
						|
        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()
 | 
						|
 | 
						|
 | 
						|
class AbstractDefaultRootTest:
 | 
						|
 | 
						|
    def setUp(self):
 | 
						|
        self._old_support_default_root = tkinter._support_default_root
 | 
						|
        destroy_default_root()
 | 
						|
        tkinter._support_default_root = True
 | 
						|
        self.wantobjects = tkinter.wantobjects
 | 
						|
 | 
						|
    def tearDown(self):
 | 
						|
        destroy_default_root()
 | 
						|
        tkinter._default_root = None
 | 
						|
        tkinter._support_default_root = self._old_support_default_root
 | 
						|
 | 
						|
    def _test_widget(self, constructor):
 | 
						|
        # no master passing
 | 
						|
        x = constructor()
 | 
						|
        self.assertIsNotNone(tkinter._default_root)
 | 
						|
        self.assertIs(x.master, tkinter._default_root)
 | 
						|
        self.assertIs(x.tk, tkinter._default_root.tk)
 | 
						|
        x.destroy()
 | 
						|
        destroy_default_root()
 | 
						|
        tkinter.NoDefaultRoot()
 | 
						|
        self.assertRaises(RuntimeError, constructor)
 | 
						|
        self.assertFalse(hasattr(tkinter, '_default_root'))
 | 
						|
 | 
						|
 | 
						|
def destroy_default_root():
 | 
						|
    if getattr(tkinter, '_default_root', None):
 | 
						|
        tkinter._default_root.update_idletasks()
 | 
						|
        tkinter._default_root.destroy()
 | 
						|
        tkinter._default_root = None
 | 
						|
 | 
						|
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)
 | 
						|
 | 
						|
 | 
						|
import _tkinter
 | 
						|
tcl_version = tuple(map(int, _tkinter.TCL_VERSION.split('.')))
 | 
						|
tk_version = tuple(map(int, _tkinter.TK_VERSION.split('.')))
 | 
						|
 | 
						|
def requires_tk(*version):
 | 
						|
    if len(version) <= 2 and tk_version >= version:
 | 
						|
        return lambda test: test
 | 
						|
 | 
						|
    def deco(test):
 | 
						|
        @functools.wraps(test)
 | 
						|
        def newtest(self):
 | 
						|
            root = getattr(self, 'root', None)
 | 
						|
            if get_tk_patchlevel(root) < version:
 | 
						|
                self.skipTest('requires Tk version >= ' +
 | 
						|
                                '.'.join(map(str, version)))
 | 
						|
            test(self)
 | 
						|
        return newtest
 | 
						|
    return deco
 | 
						|
 | 
						|
_tk_patchlevel = None
 | 
						|
def get_tk_patchlevel(root):
 | 
						|
    global _tk_patchlevel
 | 
						|
    if _tk_patchlevel is None:
 | 
						|
        _tk_patchlevel = tkinter._parse_version(root.tk.globalgetvar('tk_patchLevel'))
 | 
						|
    return _tk_patchlevel
 | 
						|
 | 
						|
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
 |