17db96d56Sopenharmony_ci"""Ttk wrapper. 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciThis module provides classes to allow using Tk themed widget set. 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ciTtk is based on a revised and enhanced version of 67db96d56Sopenharmony_ciTIP #48 (http://tip.tcl.tk/48) specified style engine. 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ciIts basic idea is to separate, to the extent possible, the code 97db96d56Sopenharmony_ciimplementing a widget's behavior from the code implementing its 107db96d56Sopenharmony_ciappearance. Widget class bindings are primarily responsible for 117db96d56Sopenharmony_cimaintaining the widget state and invoking callbacks, all aspects 127db96d56Sopenharmony_ciof the widgets appearance lies at Themes. 137db96d56Sopenharmony_ci""" 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ci__version__ = "0.3.1" 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ci__author__ = "Guilherme Polo <ggpolo@gmail.com>" 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci__all__ = ["Button", "Checkbutton", "Combobox", "Entry", "Frame", "Label", 207db96d56Sopenharmony_ci "Labelframe", "LabelFrame", "Menubutton", "Notebook", "Panedwindow", 217db96d56Sopenharmony_ci "PanedWindow", "Progressbar", "Radiobutton", "Scale", "Scrollbar", 227db96d56Sopenharmony_ci "Separator", "Sizegrip", "Spinbox", "Style", "Treeview", 237db96d56Sopenharmony_ci # Extensions 247db96d56Sopenharmony_ci "LabeledScale", "OptionMenu", 257db96d56Sopenharmony_ci # functions 267db96d56Sopenharmony_ci "tclobjs_to_py", "setup_master"] 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ciimport tkinter 297db96d56Sopenharmony_cifrom tkinter import _flatten, _join, _stringify, _splitdict 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_cidef _format_optvalue(value, script=False): 337db96d56Sopenharmony_ci """Internal function.""" 347db96d56Sopenharmony_ci if script: 357db96d56Sopenharmony_ci # if caller passes a Tcl script to tk.call, all the values need to 367db96d56Sopenharmony_ci # be grouped into words (arguments to a command in Tcl dialect) 377db96d56Sopenharmony_ci value = _stringify(value) 387db96d56Sopenharmony_ci elif isinstance(value, (list, tuple)): 397db96d56Sopenharmony_ci value = _join(value) 407db96d56Sopenharmony_ci return value 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_cidef _format_optdict(optdict, script=False, ignore=None): 437db96d56Sopenharmony_ci """Formats optdict to a tuple to pass it to tk.call. 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ci E.g. (script=False): 467db96d56Sopenharmony_ci {'foreground': 'blue', 'padding': [1, 2, 3, 4]} returns: 477db96d56Sopenharmony_ci ('-foreground', 'blue', '-padding', '1 2 3 4')""" 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci opts = [] 507db96d56Sopenharmony_ci for opt, value in optdict.items(): 517db96d56Sopenharmony_ci if not ignore or opt not in ignore: 527db96d56Sopenharmony_ci opts.append("-%s" % opt) 537db96d56Sopenharmony_ci if value is not None: 547db96d56Sopenharmony_ci opts.append(_format_optvalue(value, script)) 557db96d56Sopenharmony_ci 567db96d56Sopenharmony_ci return _flatten(opts) 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_cidef _mapdict_values(items): 597db96d56Sopenharmony_ci # each value in mapdict is expected to be a sequence, where each item 607db96d56Sopenharmony_ci # is another sequence containing a state (or several) and a value 617db96d56Sopenharmony_ci # E.g. (script=False): 627db96d56Sopenharmony_ci # [('active', 'selected', 'grey'), ('focus', [1, 2, 3, 4])] 637db96d56Sopenharmony_ci # returns: 647db96d56Sopenharmony_ci # ['active selected', 'grey', 'focus', [1, 2, 3, 4]] 657db96d56Sopenharmony_ci opt_val = [] 667db96d56Sopenharmony_ci for *state, val in items: 677db96d56Sopenharmony_ci if len(state) == 1: 687db96d56Sopenharmony_ci # if it is empty (something that evaluates to False), then 697db96d56Sopenharmony_ci # format it to Tcl code to denote the "normal" state 707db96d56Sopenharmony_ci state = state[0] or '' 717db96d56Sopenharmony_ci else: 727db96d56Sopenharmony_ci # group multiple states 737db96d56Sopenharmony_ci state = ' '.join(state) # raise TypeError if not str 747db96d56Sopenharmony_ci opt_val.append(state) 757db96d56Sopenharmony_ci if val is not None: 767db96d56Sopenharmony_ci opt_val.append(val) 777db96d56Sopenharmony_ci return opt_val 787db96d56Sopenharmony_ci 797db96d56Sopenharmony_cidef _format_mapdict(mapdict, script=False): 807db96d56Sopenharmony_ci """Formats mapdict to pass it to tk.call. 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci E.g. (script=False): 837db96d56Sopenharmony_ci {'expand': [('active', 'selected', 'grey'), ('focus', [1, 2, 3, 4])]} 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ci returns: 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci ('-expand', '{active selected} grey focus {1, 2, 3, 4}')""" 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ci opts = [] 907db96d56Sopenharmony_ci for opt, value in mapdict.items(): 917db96d56Sopenharmony_ci opts.extend(("-%s" % opt, 927db96d56Sopenharmony_ci _format_optvalue(_mapdict_values(value), script))) 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci return _flatten(opts) 957db96d56Sopenharmony_ci 967db96d56Sopenharmony_cidef _format_elemcreate(etype, script=False, *args, **kw): 977db96d56Sopenharmony_ci """Formats args and kw according to the given element factory etype.""" 987db96d56Sopenharmony_ci spec = None 997db96d56Sopenharmony_ci opts = () 1007db96d56Sopenharmony_ci if etype in ("image", "vsapi"): 1017db96d56Sopenharmony_ci if etype == "image": # define an element based on an image 1027db96d56Sopenharmony_ci # first arg should be the default image name 1037db96d56Sopenharmony_ci iname = args[0] 1047db96d56Sopenharmony_ci # next args, if any, are statespec/value pairs which is almost 1057db96d56Sopenharmony_ci # a mapdict, but we just need the value 1067db96d56Sopenharmony_ci imagespec = _join(_mapdict_values(args[1:])) 1077db96d56Sopenharmony_ci spec = "%s %s" % (iname, imagespec) 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci else: 1107db96d56Sopenharmony_ci # define an element whose visual appearance is drawn using the 1117db96d56Sopenharmony_ci # Microsoft Visual Styles API which is responsible for the 1127db96d56Sopenharmony_ci # themed styles on Windows XP and Vista. 1137db96d56Sopenharmony_ci # Availability: Tk 8.6, Windows XP and Vista. 1147db96d56Sopenharmony_ci class_name, part_id = args[:2] 1157db96d56Sopenharmony_ci statemap = _join(_mapdict_values(args[2:])) 1167db96d56Sopenharmony_ci spec = "%s %s %s" % (class_name, part_id, statemap) 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci opts = _format_optdict(kw, script) 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_ci elif etype == "from": # clone an element 1217db96d56Sopenharmony_ci # it expects a themename and optionally an element to clone from, 1227db96d56Sopenharmony_ci # otherwise it will clone {} (empty element) 1237db96d56Sopenharmony_ci spec = args[0] # theme name 1247db96d56Sopenharmony_ci if len(args) > 1: # elementfrom specified 1257db96d56Sopenharmony_ci opts = (_format_optvalue(args[1], script),) 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci if script: 1287db96d56Sopenharmony_ci spec = '{%s}' % spec 1297db96d56Sopenharmony_ci opts = ' '.join(opts) 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci return spec, opts 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_cidef _format_layoutlist(layout, indent=0, indent_size=2): 1347db96d56Sopenharmony_ci """Formats a layout list so we can pass the result to ttk::style 1357db96d56Sopenharmony_ci layout and ttk::style settings. Note that the layout doesn't have to 1367db96d56Sopenharmony_ci be a list necessarily. 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci E.g.: 1397db96d56Sopenharmony_ci [("Menubutton.background", None), 1407db96d56Sopenharmony_ci ("Menubutton.button", {"children": 1417db96d56Sopenharmony_ci [("Menubutton.focus", {"children": 1427db96d56Sopenharmony_ci [("Menubutton.padding", {"children": 1437db96d56Sopenharmony_ci [("Menubutton.label", {"side": "left", "expand": 1})] 1447db96d56Sopenharmony_ci })] 1457db96d56Sopenharmony_ci })] 1467db96d56Sopenharmony_ci }), 1477db96d56Sopenharmony_ci ("Menubutton.indicator", {"side": "right"}) 1487db96d56Sopenharmony_ci ] 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ci returns: 1517db96d56Sopenharmony_ci 1527db96d56Sopenharmony_ci Menubutton.background 1537db96d56Sopenharmony_ci Menubutton.button -children { 1547db96d56Sopenharmony_ci Menubutton.focus -children { 1557db96d56Sopenharmony_ci Menubutton.padding -children { 1567db96d56Sopenharmony_ci Menubutton.label -side left -expand 1 1577db96d56Sopenharmony_ci } 1587db96d56Sopenharmony_ci } 1597db96d56Sopenharmony_ci } 1607db96d56Sopenharmony_ci Menubutton.indicator -side right""" 1617db96d56Sopenharmony_ci script = [] 1627db96d56Sopenharmony_ci 1637db96d56Sopenharmony_ci for layout_elem in layout: 1647db96d56Sopenharmony_ci elem, opts = layout_elem 1657db96d56Sopenharmony_ci opts = opts or {} 1667db96d56Sopenharmony_ci fopts = ' '.join(_format_optdict(opts, True, ("children",))) 1677db96d56Sopenharmony_ci head = "%s%s%s" % (' ' * indent, elem, (" %s" % fopts) if fopts else '') 1687db96d56Sopenharmony_ci 1697db96d56Sopenharmony_ci if "children" in opts: 1707db96d56Sopenharmony_ci script.append(head + " -children {") 1717db96d56Sopenharmony_ci indent += indent_size 1727db96d56Sopenharmony_ci newscript, indent = _format_layoutlist(opts['children'], indent, 1737db96d56Sopenharmony_ci indent_size) 1747db96d56Sopenharmony_ci script.append(newscript) 1757db96d56Sopenharmony_ci indent -= indent_size 1767db96d56Sopenharmony_ci script.append('%s}' % (' ' * indent)) 1777db96d56Sopenharmony_ci else: 1787db96d56Sopenharmony_ci script.append(head) 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_ci return '\n'.join(script), indent 1817db96d56Sopenharmony_ci 1827db96d56Sopenharmony_cidef _script_from_settings(settings): 1837db96d56Sopenharmony_ci """Returns an appropriate script, based on settings, according to 1847db96d56Sopenharmony_ci theme_settings definition to be used by theme_settings and 1857db96d56Sopenharmony_ci theme_create.""" 1867db96d56Sopenharmony_ci script = [] 1877db96d56Sopenharmony_ci # a script will be generated according to settings passed, which 1887db96d56Sopenharmony_ci # will then be evaluated by Tcl 1897db96d56Sopenharmony_ci for name, opts in settings.items(): 1907db96d56Sopenharmony_ci # will format specific keys according to Tcl code 1917db96d56Sopenharmony_ci if opts.get('configure'): # format 'configure' 1927db96d56Sopenharmony_ci s = ' '.join(_format_optdict(opts['configure'], True)) 1937db96d56Sopenharmony_ci script.append("ttk::style configure %s %s;" % (name, s)) 1947db96d56Sopenharmony_ci 1957db96d56Sopenharmony_ci if opts.get('map'): # format 'map' 1967db96d56Sopenharmony_ci s = ' '.join(_format_mapdict(opts['map'], True)) 1977db96d56Sopenharmony_ci script.append("ttk::style map %s %s;" % (name, s)) 1987db96d56Sopenharmony_ci 1997db96d56Sopenharmony_ci if 'layout' in opts: # format 'layout' which may be empty 2007db96d56Sopenharmony_ci if not opts['layout']: 2017db96d56Sopenharmony_ci s = 'null' # could be any other word, but this one makes sense 2027db96d56Sopenharmony_ci else: 2037db96d56Sopenharmony_ci s, _ = _format_layoutlist(opts['layout']) 2047db96d56Sopenharmony_ci script.append("ttk::style layout %s {\n%s\n}" % (name, s)) 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ci if opts.get('element create'): # format 'element create' 2077db96d56Sopenharmony_ci eopts = opts['element create'] 2087db96d56Sopenharmony_ci etype = eopts[0] 2097db96d56Sopenharmony_ci 2107db96d56Sopenharmony_ci # find where args end, and where kwargs start 2117db96d56Sopenharmony_ci argc = 1 # etype was the first one 2127db96d56Sopenharmony_ci while argc < len(eopts) and not hasattr(eopts[argc], 'items'): 2137db96d56Sopenharmony_ci argc += 1 2147db96d56Sopenharmony_ci 2157db96d56Sopenharmony_ci elemargs = eopts[1:argc] 2167db96d56Sopenharmony_ci elemkw = eopts[argc] if argc < len(eopts) and eopts[argc] else {} 2177db96d56Sopenharmony_ci spec, opts = _format_elemcreate(etype, True, *elemargs, **elemkw) 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ci script.append("ttk::style element create %s %s %s %s" % ( 2207db96d56Sopenharmony_ci name, etype, spec, opts)) 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci return '\n'.join(script) 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_cidef _list_from_statespec(stuple): 2257db96d56Sopenharmony_ci """Construct a list from the given statespec tuple according to the 2267db96d56Sopenharmony_ci accepted statespec accepted by _format_mapdict.""" 2277db96d56Sopenharmony_ci if isinstance(stuple, str): 2287db96d56Sopenharmony_ci return stuple 2297db96d56Sopenharmony_ci result = [] 2307db96d56Sopenharmony_ci it = iter(stuple) 2317db96d56Sopenharmony_ci for state, val in zip(it, it): 2327db96d56Sopenharmony_ci if hasattr(state, 'typename'): # this is a Tcl object 2337db96d56Sopenharmony_ci state = str(state).split() 2347db96d56Sopenharmony_ci elif isinstance(state, str): 2357db96d56Sopenharmony_ci state = state.split() 2367db96d56Sopenharmony_ci elif not isinstance(state, (tuple, list)): 2377db96d56Sopenharmony_ci state = (state,) 2387db96d56Sopenharmony_ci if hasattr(val, 'typename'): 2397db96d56Sopenharmony_ci val = str(val) 2407db96d56Sopenharmony_ci result.append((*state, val)) 2417db96d56Sopenharmony_ci 2427db96d56Sopenharmony_ci return result 2437db96d56Sopenharmony_ci 2447db96d56Sopenharmony_cidef _list_from_layouttuple(tk, ltuple): 2457db96d56Sopenharmony_ci """Construct a list from the tuple returned by ttk::layout, this is 2467db96d56Sopenharmony_ci somewhat the reverse of _format_layoutlist.""" 2477db96d56Sopenharmony_ci ltuple = tk.splitlist(ltuple) 2487db96d56Sopenharmony_ci res = [] 2497db96d56Sopenharmony_ci 2507db96d56Sopenharmony_ci indx = 0 2517db96d56Sopenharmony_ci while indx < len(ltuple): 2527db96d56Sopenharmony_ci name = ltuple[indx] 2537db96d56Sopenharmony_ci opts = {} 2547db96d56Sopenharmony_ci res.append((name, opts)) 2557db96d56Sopenharmony_ci indx += 1 2567db96d56Sopenharmony_ci 2577db96d56Sopenharmony_ci while indx < len(ltuple): # grab name's options 2587db96d56Sopenharmony_ci opt, val = ltuple[indx:indx + 2] 2597db96d56Sopenharmony_ci if not opt.startswith('-'): # found next name 2607db96d56Sopenharmony_ci break 2617db96d56Sopenharmony_ci 2627db96d56Sopenharmony_ci opt = opt[1:] # remove the '-' from the option 2637db96d56Sopenharmony_ci indx += 2 2647db96d56Sopenharmony_ci 2657db96d56Sopenharmony_ci if opt == 'children': 2667db96d56Sopenharmony_ci val = _list_from_layouttuple(tk, val) 2677db96d56Sopenharmony_ci 2687db96d56Sopenharmony_ci opts[opt] = val 2697db96d56Sopenharmony_ci 2707db96d56Sopenharmony_ci return res 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_cidef _val_or_dict(tk, options, *args): 2737db96d56Sopenharmony_ci """Format options then call Tk command with args and options and return 2747db96d56Sopenharmony_ci the appropriate result. 2757db96d56Sopenharmony_ci 2767db96d56Sopenharmony_ci If no option is specified, a dict is returned. If an option is 2777db96d56Sopenharmony_ci specified with the None value, the value for that option is returned. 2787db96d56Sopenharmony_ci Otherwise, the function just sets the passed options and the caller 2797db96d56Sopenharmony_ci shouldn't be expecting a return value anyway.""" 2807db96d56Sopenharmony_ci options = _format_optdict(options) 2817db96d56Sopenharmony_ci res = tk.call(*(args + options)) 2827db96d56Sopenharmony_ci 2837db96d56Sopenharmony_ci if len(options) % 2: # option specified without a value, return its value 2847db96d56Sopenharmony_ci return res 2857db96d56Sopenharmony_ci 2867db96d56Sopenharmony_ci return _splitdict(tk, res, conv=_tclobj_to_py) 2877db96d56Sopenharmony_ci 2887db96d56Sopenharmony_cidef _convert_stringval(value): 2897db96d56Sopenharmony_ci """Converts a value to, hopefully, a more appropriate Python object.""" 2907db96d56Sopenharmony_ci value = str(value) 2917db96d56Sopenharmony_ci try: 2927db96d56Sopenharmony_ci value = int(value) 2937db96d56Sopenharmony_ci except (ValueError, TypeError): 2947db96d56Sopenharmony_ci pass 2957db96d56Sopenharmony_ci 2967db96d56Sopenharmony_ci return value 2977db96d56Sopenharmony_ci 2987db96d56Sopenharmony_cidef _to_number(x): 2997db96d56Sopenharmony_ci if isinstance(x, str): 3007db96d56Sopenharmony_ci if '.' in x: 3017db96d56Sopenharmony_ci x = float(x) 3027db96d56Sopenharmony_ci else: 3037db96d56Sopenharmony_ci x = int(x) 3047db96d56Sopenharmony_ci return x 3057db96d56Sopenharmony_ci 3067db96d56Sopenharmony_cidef _tclobj_to_py(val): 3077db96d56Sopenharmony_ci """Return value converted from Tcl object to Python object.""" 3087db96d56Sopenharmony_ci if val and hasattr(val, '__len__') and not isinstance(val, str): 3097db96d56Sopenharmony_ci if getattr(val[0], 'typename', None) == 'StateSpec': 3107db96d56Sopenharmony_ci val = _list_from_statespec(val) 3117db96d56Sopenharmony_ci else: 3127db96d56Sopenharmony_ci val = list(map(_convert_stringval, val)) 3137db96d56Sopenharmony_ci 3147db96d56Sopenharmony_ci elif hasattr(val, 'typename'): # some other (single) Tcl object 3157db96d56Sopenharmony_ci val = _convert_stringval(val) 3167db96d56Sopenharmony_ci 3177db96d56Sopenharmony_ci return val 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_cidef tclobjs_to_py(adict): 3207db96d56Sopenharmony_ci """Returns adict with its values converted from Tcl objects to Python 3217db96d56Sopenharmony_ci objects.""" 3227db96d56Sopenharmony_ci for opt, val in adict.items(): 3237db96d56Sopenharmony_ci adict[opt] = _tclobj_to_py(val) 3247db96d56Sopenharmony_ci 3257db96d56Sopenharmony_ci return adict 3267db96d56Sopenharmony_ci 3277db96d56Sopenharmony_cidef setup_master(master=None): 3287db96d56Sopenharmony_ci """If master is not None, itself is returned. If master is None, 3297db96d56Sopenharmony_ci the default master is returned if there is one, otherwise a new 3307db96d56Sopenharmony_ci master is created and returned. 3317db96d56Sopenharmony_ci 3327db96d56Sopenharmony_ci If it is not allowed to use the default root and master is None, 3337db96d56Sopenharmony_ci RuntimeError is raised.""" 3347db96d56Sopenharmony_ci if master is None: 3357db96d56Sopenharmony_ci master = tkinter._get_default_root() 3367db96d56Sopenharmony_ci return master 3377db96d56Sopenharmony_ci 3387db96d56Sopenharmony_ci 3397db96d56Sopenharmony_ciclass Style(object): 3407db96d56Sopenharmony_ci """Manipulate style database.""" 3417db96d56Sopenharmony_ci 3427db96d56Sopenharmony_ci _name = "ttk::style" 3437db96d56Sopenharmony_ci 3447db96d56Sopenharmony_ci def __init__(self, master=None): 3457db96d56Sopenharmony_ci master = setup_master(master) 3467db96d56Sopenharmony_ci self.master = master 3477db96d56Sopenharmony_ci self.tk = self.master.tk 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci 3507db96d56Sopenharmony_ci def configure(self, style, query_opt=None, **kw): 3517db96d56Sopenharmony_ci """Query or sets the default value of the specified option(s) in 3527db96d56Sopenharmony_ci style. 3537db96d56Sopenharmony_ci 3547db96d56Sopenharmony_ci Each key in kw is an option and each value is either a string or 3557db96d56Sopenharmony_ci a sequence identifying the value for that option.""" 3567db96d56Sopenharmony_ci if query_opt is not None: 3577db96d56Sopenharmony_ci kw[query_opt] = None 3587db96d56Sopenharmony_ci result = _val_or_dict(self.tk, kw, self._name, "configure", style) 3597db96d56Sopenharmony_ci if result or query_opt: 3607db96d56Sopenharmony_ci return result 3617db96d56Sopenharmony_ci 3627db96d56Sopenharmony_ci 3637db96d56Sopenharmony_ci def map(self, style, query_opt=None, **kw): 3647db96d56Sopenharmony_ci """Query or sets dynamic values of the specified option(s) in 3657db96d56Sopenharmony_ci style. 3667db96d56Sopenharmony_ci 3677db96d56Sopenharmony_ci Each key in kw is an option and each value should be a list or a 3687db96d56Sopenharmony_ci tuple (usually) containing statespecs grouped in tuples, or list, 3697db96d56Sopenharmony_ci or something else of your preference. A statespec is compound of 3707db96d56Sopenharmony_ci one or more states and then a value.""" 3717db96d56Sopenharmony_ci if query_opt is not None: 3727db96d56Sopenharmony_ci result = self.tk.call(self._name, "map", style, '-%s' % query_opt) 3737db96d56Sopenharmony_ci return _list_from_statespec(self.tk.splitlist(result)) 3747db96d56Sopenharmony_ci 3757db96d56Sopenharmony_ci result = self.tk.call(self._name, "map", style, *_format_mapdict(kw)) 3767db96d56Sopenharmony_ci return {k: _list_from_statespec(self.tk.splitlist(v)) 3777db96d56Sopenharmony_ci for k, v in _splitdict(self.tk, result).items()} 3787db96d56Sopenharmony_ci 3797db96d56Sopenharmony_ci 3807db96d56Sopenharmony_ci def lookup(self, style, option, state=None, default=None): 3817db96d56Sopenharmony_ci """Returns the value specified for option in style. 3827db96d56Sopenharmony_ci 3837db96d56Sopenharmony_ci If state is specified it is expected to be a sequence of one 3847db96d56Sopenharmony_ci or more states. If the default argument is set, it is used as 3857db96d56Sopenharmony_ci a fallback value in case no specification for option is found.""" 3867db96d56Sopenharmony_ci state = ' '.join(state) if state else '' 3877db96d56Sopenharmony_ci 3887db96d56Sopenharmony_ci return self.tk.call(self._name, "lookup", style, '-%s' % option, 3897db96d56Sopenharmony_ci state, default) 3907db96d56Sopenharmony_ci 3917db96d56Sopenharmony_ci 3927db96d56Sopenharmony_ci def layout(self, style, layoutspec=None): 3937db96d56Sopenharmony_ci """Define the widget layout for given style. If layoutspec is 3947db96d56Sopenharmony_ci omitted, return the layout specification for given style. 3957db96d56Sopenharmony_ci 3967db96d56Sopenharmony_ci layoutspec is expected to be a list or an object different than 3977db96d56Sopenharmony_ci None that evaluates to False if you want to "turn off" that style. 3987db96d56Sopenharmony_ci If it is a list (or tuple, or something else), each item should be 3997db96d56Sopenharmony_ci a tuple where the first item is the layout name and the second item 4007db96d56Sopenharmony_ci should have the format described below: 4017db96d56Sopenharmony_ci 4027db96d56Sopenharmony_ci LAYOUTS 4037db96d56Sopenharmony_ci 4047db96d56Sopenharmony_ci A layout can contain the value None, if takes no options, or 4057db96d56Sopenharmony_ci a dict of options specifying how to arrange the element. 4067db96d56Sopenharmony_ci The layout mechanism uses a simplified version of the pack 4077db96d56Sopenharmony_ci geometry manager: given an initial cavity, each element is 4087db96d56Sopenharmony_ci allocated a parcel. Valid options/values are: 4097db96d56Sopenharmony_ci 4107db96d56Sopenharmony_ci side: whichside 4117db96d56Sopenharmony_ci Specifies which side of the cavity to place the 4127db96d56Sopenharmony_ci element; one of top, right, bottom or left. If 4137db96d56Sopenharmony_ci omitted, the element occupies the entire cavity. 4147db96d56Sopenharmony_ci 4157db96d56Sopenharmony_ci sticky: nswe 4167db96d56Sopenharmony_ci Specifies where the element is placed inside its 4177db96d56Sopenharmony_ci allocated parcel. 4187db96d56Sopenharmony_ci 4197db96d56Sopenharmony_ci children: [sublayout... ] 4207db96d56Sopenharmony_ci Specifies a list of elements to place inside the 4217db96d56Sopenharmony_ci element. Each element is a tuple (or other sequence) 4227db96d56Sopenharmony_ci where the first item is the layout name, and the other 4237db96d56Sopenharmony_ci is a LAYOUT.""" 4247db96d56Sopenharmony_ci lspec = None 4257db96d56Sopenharmony_ci if layoutspec: 4267db96d56Sopenharmony_ci lspec = _format_layoutlist(layoutspec)[0] 4277db96d56Sopenharmony_ci elif layoutspec is not None: # will disable the layout ({}, '', etc) 4287db96d56Sopenharmony_ci lspec = "null" # could be any other word, but this may make sense 4297db96d56Sopenharmony_ci # when calling layout(style) later 4307db96d56Sopenharmony_ci 4317db96d56Sopenharmony_ci return _list_from_layouttuple(self.tk, 4327db96d56Sopenharmony_ci self.tk.call(self._name, "layout", style, lspec)) 4337db96d56Sopenharmony_ci 4347db96d56Sopenharmony_ci 4357db96d56Sopenharmony_ci def element_create(self, elementname, etype, *args, **kw): 4367db96d56Sopenharmony_ci """Create a new element in the current theme of given etype.""" 4377db96d56Sopenharmony_ci spec, opts = _format_elemcreate(etype, False, *args, **kw) 4387db96d56Sopenharmony_ci self.tk.call(self._name, "element", "create", elementname, etype, 4397db96d56Sopenharmony_ci spec, *opts) 4407db96d56Sopenharmony_ci 4417db96d56Sopenharmony_ci 4427db96d56Sopenharmony_ci def element_names(self): 4437db96d56Sopenharmony_ci """Returns the list of elements defined in the current theme.""" 4447db96d56Sopenharmony_ci return tuple(n.lstrip('-') for n in self.tk.splitlist( 4457db96d56Sopenharmony_ci self.tk.call(self._name, "element", "names"))) 4467db96d56Sopenharmony_ci 4477db96d56Sopenharmony_ci 4487db96d56Sopenharmony_ci def element_options(self, elementname): 4497db96d56Sopenharmony_ci """Return the list of elementname's options.""" 4507db96d56Sopenharmony_ci return tuple(o.lstrip('-') for o in self.tk.splitlist( 4517db96d56Sopenharmony_ci self.tk.call(self._name, "element", "options", elementname))) 4527db96d56Sopenharmony_ci 4537db96d56Sopenharmony_ci 4547db96d56Sopenharmony_ci def theme_create(self, themename, parent=None, settings=None): 4557db96d56Sopenharmony_ci """Creates a new theme. 4567db96d56Sopenharmony_ci 4577db96d56Sopenharmony_ci It is an error if themename already exists. If parent is 4587db96d56Sopenharmony_ci specified, the new theme will inherit styles, elements and 4597db96d56Sopenharmony_ci layouts from the specified parent theme. If settings are present, 4607db96d56Sopenharmony_ci they are expected to have the same syntax used for theme_settings.""" 4617db96d56Sopenharmony_ci script = _script_from_settings(settings) if settings else '' 4627db96d56Sopenharmony_ci 4637db96d56Sopenharmony_ci if parent: 4647db96d56Sopenharmony_ci self.tk.call(self._name, "theme", "create", themename, 4657db96d56Sopenharmony_ci "-parent", parent, "-settings", script) 4667db96d56Sopenharmony_ci else: 4677db96d56Sopenharmony_ci self.tk.call(self._name, "theme", "create", themename, 4687db96d56Sopenharmony_ci "-settings", script) 4697db96d56Sopenharmony_ci 4707db96d56Sopenharmony_ci 4717db96d56Sopenharmony_ci def theme_settings(self, themename, settings): 4727db96d56Sopenharmony_ci """Temporarily sets the current theme to themename, apply specified 4737db96d56Sopenharmony_ci settings and then restore the previous theme. 4747db96d56Sopenharmony_ci 4757db96d56Sopenharmony_ci Each key in settings is a style and each value may contain the 4767db96d56Sopenharmony_ci keys 'configure', 'map', 'layout' and 'element create' and they 4777db96d56Sopenharmony_ci are expected to have the same format as specified by the methods 4787db96d56Sopenharmony_ci configure, map, layout and element_create respectively.""" 4797db96d56Sopenharmony_ci script = _script_from_settings(settings) 4807db96d56Sopenharmony_ci self.tk.call(self._name, "theme", "settings", themename, script) 4817db96d56Sopenharmony_ci 4827db96d56Sopenharmony_ci 4837db96d56Sopenharmony_ci def theme_names(self): 4847db96d56Sopenharmony_ci """Returns a list of all known themes.""" 4857db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call(self._name, "theme", "names")) 4867db96d56Sopenharmony_ci 4877db96d56Sopenharmony_ci 4887db96d56Sopenharmony_ci def theme_use(self, themename=None): 4897db96d56Sopenharmony_ci """If themename is None, returns the theme in use, otherwise, set 4907db96d56Sopenharmony_ci the current theme to themename, refreshes all widgets and emits 4917db96d56Sopenharmony_ci a <<ThemeChanged>> event.""" 4927db96d56Sopenharmony_ci if themename is None: 4937db96d56Sopenharmony_ci # Starting on Tk 8.6, checking this global is no longer needed 4947db96d56Sopenharmony_ci # since it allows doing self.tk.call(self._name, "theme", "use") 4957db96d56Sopenharmony_ci return self.tk.eval("return $ttk::currentTheme") 4967db96d56Sopenharmony_ci 4977db96d56Sopenharmony_ci # using "ttk::setTheme" instead of "ttk::style theme use" causes 4987db96d56Sopenharmony_ci # the variable currentTheme to be updated, also, ttk::setTheme calls 4997db96d56Sopenharmony_ci # "ttk::style theme use" in order to change theme. 5007db96d56Sopenharmony_ci self.tk.call("ttk::setTheme", themename) 5017db96d56Sopenharmony_ci 5027db96d56Sopenharmony_ci 5037db96d56Sopenharmony_ciclass Widget(tkinter.Widget): 5047db96d56Sopenharmony_ci """Base class for Tk themed widgets.""" 5057db96d56Sopenharmony_ci 5067db96d56Sopenharmony_ci def __init__(self, master, widgetname, kw=None): 5077db96d56Sopenharmony_ci """Constructs a Ttk Widget with the parent master. 5087db96d56Sopenharmony_ci 5097db96d56Sopenharmony_ci STANDARD OPTIONS 5107db96d56Sopenharmony_ci 5117db96d56Sopenharmony_ci class, cursor, takefocus, style 5127db96d56Sopenharmony_ci 5137db96d56Sopenharmony_ci SCROLLABLE WIDGET OPTIONS 5147db96d56Sopenharmony_ci 5157db96d56Sopenharmony_ci xscrollcommand, yscrollcommand 5167db96d56Sopenharmony_ci 5177db96d56Sopenharmony_ci LABEL WIDGET OPTIONS 5187db96d56Sopenharmony_ci 5197db96d56Sopenharmony_ci text, textvariable, underline, image, compound, width 5207db96d56Sopenharmony_ci 5217db96d56Sopenharmony_ci WIDGET STATES 5227db96d56Sopenharmony_ci 5237db96d56Sopenharmony_ci active, disabled, focus, pressed, selected, background, 5247db96d56Sopenharmony_ci readonly, alternate, invalid 5257db96d56Sopenharmony_ci """ 5267db96d56Sopenharmony_ci master = setup_master(master) 5277db96d56Sopenharmony_ci tkinter.Widget.__init__(self, master, widgetname, kw=kw) 5287db96d56Sopenharmony_ci 5297db96d56Sopenharmony_ci 5307db96d56Sopenharmony_ci def identify(self, x, y): 5317db96d56Sopenharmony_ci """Returns the name of the element at position x, y, or the empty 5327db96d56Sopenharmony_ci string if the point does not lie within any element. 5337db96d56Sopenharmony_ci 5347db96d56Sopenharmony_ci x and y are pixel coordinates relative to the widget.""" 5357db96d56Sopenharmony_ci return self.tk.call(self._w, "identify", x, y) 5367db96d56Sopenharmony_ci 5377db96d56Sopenharmony_ci 5387db96d56Sopenharmony_ci def instate(self, statespec, callback=None, *args, **kw): 5397db96d56Sopenharmony_ci """Test the widget's state. 5407db96d56Sopenharmony_ci 5417db96d56Sopenharmony_ci If callback is not specified, returns True if the widget state 5427db96d56Sopenharmony_ci matches statespec and False otherwise. If callback is specified, 5437db96d56Sopenharmony_ci then it will be invoked with *args, **kw if the widget state 5447db96d56Sopenharmony_ci matches statespec. statespec is expected to be a sequence.""" 5457db96d56Sopenharmony_ci ret = self.tk.getboolean( 5467db96d56Sopenharmony_ci self.tk.call(self._w, "instate", ' '.join(statespec))) 5477db96d56Sopenharmony_ci if ret and callback is not None: 5487db96d56Sopenharmony_ci return callback(*args, **kw) 5497db96d56Sopenharmony_ci 5507db96d56Sopenharmony_ci return ret 5517db96d56Sopenharmony_ci 5527db96d56Sopenharmony_ci 5537db96d56Sopenharmony_ci def state(self, statespec=None): 5547db96d56Sopenharmony_ci """Modify or inquire widget state. 5557db96d56Sopenharmony_ci 5567db96d56Sopenharmony_ci Widget state is returned if statespec is None, otherwise it is 5577db96d56Sopenharmony_ci set according to the statespec flags and then a new state spec 5587db96d56Sopenharmony_ci is returned indicating which flags were changed. statespec is 5597db96d56Sopenharmony_ci expected to be a sequence.""" 5607db96d56Sopenharmony_ci if statespec is not None: 5617db96d56Sopenharmony_ci statespec = ' '.join(statespec) 5627db96d56Sopenharmony_ci 5637db96d56Sopenharmony_ci return self.tk.splitlist(str(self.tk.call(self._w, "state", statespec))) 5647db96d56Sopenharmony_ci 5657db96d56Sopenharmony_ci 5667db96d56Sopenharmony_ciclass Button(Widget): 5677db96d56Sopenharmony_ci """Ttk Button widget, displays a textual label and/or image, and 5687db96d56Sopenharmony_ci evaluates a command when pressed.""" 5697db96d56Sopenharmony_ci 5707db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 5717db96d56Sopenharmony_ci """Construct a Ttk Button widget with the parent master. 5727db96d56Sopenharmony_ci 5737db96d56Sopenharmony_ci STANDARD OPTIONS 5747db96d56Sopenharmony_ci 5757db96d56Sopenharmony_ci class, compound, cursor, image, state, style, takefocus, 5767db96d56Sopenharmony_ci text, textvariable, underline, width 5777db96d56Sopenharmony_ci 5787db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 5797db96d56Sopenharmony_ci 5807db96d56Sopenharmony_ci command, default, width 5817db96d56Sopenharmony_ci """ 5827db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::button", kw) 5837db96d56Sopenharmony_ci 5847db96d56Sopenharmony_ci 5857db96d56Sopenharmony_ci def invoke(self): 5867db96d56Sopenharmony_ci """Invokes the command associated with the button.""" 5877db96d56Sopenharmony_ci return self.tk.call(self._w, "invoke") 5887db96d56Sopenharmony_ci 5897db96d56Sopenharmony_ci 5907db96d56Sopenharmony_ciclass Checkbutton(Widget): 5917db96d56Sopenharmony_ci """Ttk Checkbutton widget which is either in on- or off-state.""" 5927db96d56Sopenharmony_ci 5937db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 5947db96d56Sopenharmony_ci """Construct a Ttk Checkbutton widget with the parent master. 5957db96d56Sopenharmony_ci 5967db96d56Sopenharmony_ci STANDARD OPTIONS 5977db96d56Sopenharmony_ci 5987db96d56Sopenharmony_ci class, compound, cursor, image, state, style, takefocus, 5997db96d56Sopenharmony_ci text, textvariable, underline, width 6007db96d56Sopenharmony_ci 6017db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 6027db96d56Sopenharmony_ci 6037db96d56Sopenharmony_ci command, offvalue, onvalue, variable 6047db96d56Sopenharmony_ci """ 6057db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::checkbutton", kw) 6067db96d56Sopenharmony_ci 6077db96d56Sopenharmony_ci 6087db96d56Sopenharmony_ci def invoke(self): 6097db96d56Sopenharmony_ci """Toggles between the selected and deselected states and 6107db96d56Sopenharmony_ci invokes the associated command. If the widget is currently 6117db96d56Sopenharmony_ci selected, sets the option variable to the offvalue option 6127db96d56Sopenharmony_ci and deselects the widget; otherwise, sets the option variable 6137db96d56Sopenharmony_ci to the option onvalue. 6147db96d56Sopenharmony_ci 6157db96d56Sopenharmony_ci Returns the result of the associated command.""" 6167db96d56Sopenharmony_ci return self.tk.call(self._w, "invoke") 6177db96d56Sopenharmony_ci 6187db96d56Sopenharmony_ci 6197db96d56Sopenharmony_ciclass Entry(Widget, tkinter.Entry): 6207db96d56Sopenharmony_ci """Ttk Entry widget displays a one-line text string and allows that 6217db96d56Sopenharmony_ci string to be edited by the user.""" 6227db96d56Sopenharmony_ci 6237db96d56Sopenharmony_ci def __init__(self, master=None, widget=None, **kw): 6247db96d56Sopenharmony_ci """Constructs a Ttk Entry widget with the parent master. 6257db96d56Sopenharmony_ci 6267db96d56Sopenharmony_ci STANDARD OPTIONS 6277db96d56Sopenharmony_ci 6287db96d56Sopenharmony_ci class, cursor, style, takefocus, xscrollcommand 6297db96d56Sopenharmony_ci 6307db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 6317db96d56Sopenharmony_ci 6327db96d56Sopenharmony_ci exportselection, invalidcommand, justify, show, state, 6337db96d56Sopenharmony_ci textvariable, validate, validatecommand, width 6347db96d56Sopenharmony_ci 6357db96d56Sopenharmony_ci VALIDATION MODES 6367db96d56Sopenharmony_ci 6377db96d56Sopenharmony_ci none, key, focus, focusin, focusout, all 6387db96d56Sopenharmony_ci """ 6397db96d56Sopenharmony_ci Widget.__init__(self, master, widget or "ttk::entry", kw) 6407db96d56Sopenharmony_ci 6417db96d56Sopenharmony_ci 6427db96d56Sopenharmony_ci def bbox(self, index): 6437db96d56Sopenharmony_ci """Return a tuple of (x, y, width, height) which describes the 6447db96d56Sopenharmony_ci bounding box of the character given by index.""" 6457db96d56Sopenharmony_ci return self._getints(self.tk.call(self._w, "bbox", index)) 6467db96d56Sopenharmony_ci 6477db96d56Sopenharmony_ci 6487db96d56Sopenharmony_ci def identify(self, x, y): 6497db96d56Sopenharmony_ci """Returns the name of the element at position x, y, or the 6507db96d56Sopenharmony_ci empty string if the coordinates are outside the window.""" 6517db96d56Sopenharmony_ci return self.tk.call(self._w, "identify", x, y) 6527db96d56Sopenharmony_ci 6537db96d56Sopenharmony_ci 6547db96d56Sopenharmony_ci def validate(self): 6557db96d56Sopenharmony_ci """Force revalidation, independent of the conditions specified 6567db96d56Sopenharmony_ci by the validate option. Returns False if validation fails, True 6577db96d56Sopenharmony_ci if it succeeds. Sets or clears the invalid state accordingly.""" 6587db96d56Sopenharmony_ci return self.tk.getboolean(self.tk.call(self._w, "validate")) 6597db96d56Sopenharmony_ci 6607db96d56Sopenharmony_ci 6617db96d56Sopenharmony_ciclass Combobox(Entry): 6627db96d56Sopenharmony_ci """Ttk Combobox widget combines a text field with a pop-down list of 6637db96d56Sopenharmony_ci values.""" 6647db96d56Sopenharmony_ci 6657db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 6667db96d56Sopenharmony_ci """Construct a Ttk Combobox widget with the parent master. 6677db96d56Sopenharmony_ci 6687db96d56Sopenharmony_ci STANDARD OPTIONS 6697db96d56Sopenharmony_ci 6707db96d56Sopenharmony_ci class, cursor, style, takefocus 6717db96d56Sopenharmony_ci 6727db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 6737db96d56Sopenharmony_ci 6747db96d56Sopenharmony_ci exportselection, justify, height, postcommand, state, 6757db96d56Sopenharmony_ci textvariable, values, width 6767db96d56Sopenharmony_ci """ 6777db96d56Sopenharmony_ci Entry.__init__(self, master, "ttk::combobox", **kw) 6787db96d56Sopenharmony_ci 6797db96d56Sopenharmony_ci 6807db96d56Sopenharmony_ci def current(self, newindex=None): 6817db96d56Sopenharmony_ci """If newindex is supplied, sets the combobox value to the 6827db96d56Sopenharmony_ci element at position newindex in the list of values. Otherwise, 6837db96d56Sopenharmony_ci returns the index of the current value in the list of values 6847db96d56Sopenharmony_ci or -1 if the current value does not appear in the list.""" 6857db96d56Sopenharmony_ci if newindex is None: 6867db96d56Sopenharmony_ci return self.tk.getint(self.tk.call(self._w, "current")) 6877db96d56Sopenharmony_ci return self.tk.call(self._w, "current", newindex) 6887db96d56Sopenharmony_ci 6897db96d56Sopenharmony_ci 6907db96d56Sopenharmony_ci def set(self, value): 6917db96d56Sopenharmony_ci """Sets the value of the combobox to value.""" 6927db96d56Sopenharmony_ci self.tk.call(self._w, "set", value) 6937db96d56Sopenharmony_ci 6947db96d56Sopenharmony_ci 6957db96d56Sopenharmony_ciclass Frame(Widget): 6967db96d56Sopenharmony_ci """Ttk Frame widget is a container, used to group other widgets 6977db96d56Sopenharmony_ci together.""" 6987db96d56Sopenharmony_ci 6997db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 7007db96d56Sopenharmony_ci """Construct a Ttk Frame with parent master. 7017db96d56Sopenharmony_ci 7027db96d56Sopenharmony_ci STANDARD OPTIONS 7037db96d56Sopenharmony_ci 7047db96d56Sopenharmony_ci class, cursor, style, takefocus 7057db96d56Sopenharmony_ci 7067db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 7077db96d56Sopenharmony_ci 7087db96d56Sopenharmony_ci borderwidth, relief, padding, width, height 7097db96d56Sopenharmony_ci """ 7107db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::frame", kw) 7117db96d56Sopenharmony_ci 7127db96d56Sopenharmony_ci 7137db96d56Sopenharmony_ciclass Label(Widget): 7147db96d56Sopenharmony_ci """Ttk Label widget displays a textual label and/or image.""" 7157db96d56Sopenharmony_ci 7167db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 7177db96d56Sopenharmony_ci """Construct a Ttk Label with parent master. 7187db96d56Sopenharmony_ci 7197db96d56Sopenharmony_ci STANDARD OPTIONS 7207db96d56Sopenharmony_ci 7217db96d56Sopenharmony_ci class, compound, cursor, image, style, takefocus, text, 7227db96d56Sopenharmony_ci textvariable, underline, width 7237db96d56Sopenharmony_ci 7247db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 7257db96d56Sopenharmony_ci 7267db96d56Sopenharmony_ci anchor, background, font, foreground, justify, padding, 7277db96d56Sopenharmony_ci relief, text, wraplength 7287db96d56Sopenharmony_ci """ 7297db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::label", kw) 7307db96d56Sopenharmony_ci 7317db96d56Sopenharmony_ci 7327db96d56Sopenharmony_ciclass Labelframe(Widget): 7337db96d56Sopenharmony_ci """Ttk Labelframe widget is a container used to group other widgets 7347db96d56Sopenharmony_ci together. It has an optional label, which may be a plain text string 7357db96d56Sopenharmony_ci or another widget.""" 7367db96d56Sopenharmony_ci 7377db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 7387db96d56Sopenharmony_ci """Construct a Ttk Labelframe with parent master. 7397db96d56Sopenharmony_ci 7407db96d56Sopenharmony_ci STANDARD OPTIONS 7417db96d56Sopenharmony_ci 7427db96d56Sopenharmony_ci class, cursor, style, takefocus 7437db96d56Sopenharmony_ci 7447db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 7457db96d56Sopenharmony_ci labelanchor, text, underline, padding, labelwidget, width, 7467db96d56Sopenharmony_ci height 7477db96d56Sopenharmony_ci """ 7487db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::labelframe", kw) 7497db96d56Sopenharmony_ci 7507db96d56Sopenharmony_ciLabelFrame = Labelframe # tkinter name compatibility 7517db96d56Sopenharmony_ci 7527db96d56Sopenharmony_ci 7537db96d56Sopenharmony_ciclass Menubutton(Widget): 7547db96d56Sopenharmony_ci """Ttk Menubutton widget displays a textual label and/or image, and 7557db96d56Sopenharmony_ci displays a menu when pressed.""" 7567db96d56Sopenharmony_ci 7577db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 7587db96d56Sopenharmony_ci """Construct a Ttk Menubutton with parent master. 7597db96d56Sopenharmony_ci 7607db96d56Sopenharmony_ci STANDARD OPTIONS 7617db96d56Sopenharmony_ci 7627db96d56Sopenharmony_ci class, compound, cursor, image, state, style, takefocus, 7637db96d56Sopenharmony_ci text, textvariable, underline, width 7647db96d56Sopenharmony_ci 7657db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 7667db96d56Sopenharmony_ci 7677db96d56Sopenharmony_ci direction, menu 7687db96d56Sopenharmony_ci """ 7697db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::menubutton", kw) 7707db96d56Sopenharmony_ci 7717db96d56Sopenharmony_ci 7727db96d56Sopenharmony_ciclass Notebook(Widget): 7737db96d56Sopenharmony_ci """Ttk Notebook widget manages a collection of windows and displays 7747db96d56Sopenharmony_ci a single one at a time. Each child window is associated with a tab, 7757db96d56Sopenharmony_ci which the user may select to change the currently-displayed window.""" 7767db96d56Sopenharmony_ci 7777db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 7787db96d56Sopenharmony_ci """Construct a Ttk Notebook with parent master. 7797db96d56Sopenharmony_ci 7807db96d56Sopenharmony_ci STANDARD OPTIONS 7817db96d56Sopenharmony_ci 7827db96d56Sopenharmony_ci class, cursor, style, takefocus 7837db96d56Sopenharmony_ci 7847db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 7857db96d56Sopenharmony_ci 7867db96d56Sopenharmony_ci height, padding, width 7877db96d56Sopenharmony_ci 7887db96d56Sopenharmony_ci TAB OPTIONS 7897db96d56Sopenharmony_ci 7907db96d56Sopenharmony_ci state, sticky, padding, text, image, compound, underline 7917db96d56Sopenharmony_ci 7927db96d56Sopenharmony_ci TAB IDENTIFIERS (tab_id) 7937db96d56Sopenharmony_ci 7947db96d56Sopenharmony_ci The tab_id argument found in several methods may take any of 7957db96d56Sopenharmony_ci the following forms: 7967db96d56Sopenharmony_ci 7977db96d56Sopenharmony_ci * An integer between zero and the number of tabs 7987db96d56Sopenharmony_ci * The name of a child window 7997db96d56Sopenharmony_ci * A positional specification of the form "@x,y", which 8007db96d56Sopenharmony_ci defines the tab 8017db96d56Sopenharmony_ci * The string "current", which identifies the 8027db96d56Sopenharmony_ci currently-selected tab 8037db96d56Sopenharmony_ci * The string "end", which returns the number of tabs (only 8047db96d56Sopenharmony_ci valid for method index) 8057db96d56Sopenharmony_ci """ 8067db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::notebook", kw) 8077db96d56Sopenharmony_ci 8087db96d56Sopenharmony_ci 8097db96d56Sopenharmony_ci def add(self, child, **kw): 8107db96d56Sopenharmony_ci """Adds a new tab to the notebook. 8117db96d56Sopenharmony_ci 8127db96d56Sopenharmony_ci If window is currently managed by the notebook but hidden, it is 8137db96d56Sopenharmony_ci restored to its previous position.""" 8147db96d56Sopenharmony_ci self.tk.call(self._w, "add", child, *(_format_optdict(kw))) 8157db96d56Sopenharmony_ci 8167db96d56Sopenharmony_ci 8177db96d56Sopenharmony_ci def forget(self, tab_id): 8187db96d56Sopenharmony_ci """Removes the tab specified by tab_id, unmaps and unmanages the 8197db96d56Sopenharmony_ci associated window.""" 8207db96d56Sopenharmony_ci self.tk.call(self._w, "forget", tab_id) 8217db96d56Sopenharmony_ci 8227db96d56Sopenharmony_ci 8237db96d56Sopenharmony_ci def hide(self, tab_id): 8247db96d56Sopenharmony_ci """Hides the tab specified by tab_id. 8257db96d56Sopenharmony_ci 8267db96d56Sopenharmony_ci The tab will not be displayed, but the associated window remains 8277db96d56Sopenharmony_ci managed by the notebook and its configuration remembered. Hidden 8287db96d56Sopenharmony_ci tabs may be restored with the add command.""" 8297db96d56Sopenharmony_ci self.tk.call(self._w, "hide", tab_id) 8307db96d56Sopenharmony_ci 8317db96d56Sopenharmony_ci 8327db96d56Sopenharmony_ci def identify(self, x, y): 8337db96d56Sopenharmony_ci """Returns the name of the tab element at position x, y, or the 8347db96d56Sopenharmony_ci empty string if none.""" 8357db96d56Sopenharmony_ci return self.tk.call(self._w, "identify", x, y) 8367db96d56Sopenharmony_ci 8377db96d56Sopenharmony_ci 8387db96d56Sopenharmony_ci def index(self, tab_id): 8397db96d56Sopenharmony_ci """Returns the numeric index of the tab specified by tab_id, or 8407db96d56Sopenharmony_ci the total number of tabs if tab_id is the string "end".""" 8417db96d56Sopenharmony_ci return self.tk.getint(self.tk.call(self._w, "index", tab_id)) 8427db96d56Sopenharmony_ci 8437db96d56Sopenharmony_ci 8447db96d56Sopenharmony_ci def insert(self, pos, child, **kw): 8457db96d56Sopenharmony_ci """Inserts a pane at the specified position. 8467db96d56Sopenharmony_ci 8477db96d56Sopenharmony_ci pos is either the string end, an integer index, or the name of 8487db96d56Sopenharmony_ci a managed child. If child is already managed by the notebook, 8497db96d56Sopenharmony_ci moves it to the specified position.""" 8507db96d56Sopenharmony_ci self.tk.call(self._w, "insert", pos, child, *(_format_optdict(kw))) 8517db96d56Sopenharmony_ci 8527db96d56Sopenharmony_ci 8537db96d56Sopenharmony_ci def select(self, tab_id=None): 8547db96d56Sopenharmony_ci """Selects the specified tab. 8557db96d56Sopenharmony_ci 8567db96d56Sopenharmony_ci The associated child window will be displayed, and the 8577db96d56Sopenharmony_ci previously-selected window (if different) is unmapped. If tab_id 8587db96d56Sopenharmony_ci is omitted, returns the widget name of the currently selected 8597db96d56Sopenharmony_ci pane.""" 8607db96d56Sopenharmony_ci return self.tk.call(self._w, "select", tab_id) 8617db96d56Sopenharmony_ci 8627db96d56Sopenharmony_ci 8637db96d56Sopenharmony_ci def tab(self, tab_id, option=None, **kw): 8647db96d56Sopenharmony_ci """Query or modify the options of the specific tab_id. 8657db96d56Sopenharmony_ci 8667db96d56Sopenharmony_ci If kw is not given, returns a dict of the tab option values. If option 8677db96d56Sopenharmony_ci is specified, returns the value of that option. Otherwise, sets the 8687db96d56Sopenharmony_ci options to the corresponding values.""" 8697db96d56Sopenharmony_ci if option is not None: 8707db96d56Sopenharmony_ci kw[option] = None 8717db96d56Sopenharmony_ci return _val_or_dict(self.tk, kw, self._w, "tab", tab_id) 8727db96d56Sopenharmony_ci 8737db96d56Sopenharmony_ci 8747db96d56Sopenharmony_ci def tabs(self): 8757db96d56Sopenharmony_ci """Returns a list of windows managed by the notebook.""" 8767db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call(self._w, "tabs") or ()) 8777db96d56Sopenharmony_ci 8787db96d56Sopenharmony_ci 8797db96d56Sopenharmony_ci def enable_traversal(self): 8807db96d56Sopenharmony_ci """Enable keyboard traversal for a toplevel window containing 8817db96d56Sopenharmony_ci this notebook. 8827db96d56Sopenharmony_ci 8837db96d56Sopenharmony_ci This will extend the bindings for the toplevel window containing 8847db96d56Sopenharmony_ci this notebook as follows: 8857db96d56Sopenharmony_ci 8867db96d56Sopenharmony_ci Control-Tab: selects the tab following the currently selected 8877db96d56Sopenharmony_ci one 8887db96d56Sopenharmony_ci 8897db96d56Sopenharmony_ci Shift-Control-Tab: selects the tab preceding the currently 8907db96d56Sopenharmony_ci selected one 8917db96d56Sopenharmony_ci 8927db96d56Sopenharmony_ci Alt-K: where K is the mnemonic (underlined) character of any 8937db96d56Sopenharmony_ci tab, will select that tab. 8947db96d56Sopenharmony_ci 8957db96d56Sopenharmony_ci Multiple notebooks in a single toplevel may be enabled for 8967db96d56Sopenharmony_ci traversal, including nested notebooks. However, notebook traversal 8977db96d56Sopenharmony_ci only works properly if all panes are direct children of the 8987db96d56Sopenharmony_ci notebook.""" 8997db96d56Sopenharmony_ci # The only, and good, difference I see is about mnemonics, which works 9007db96d56Sopenharmony_ci # after calling this method. Control-Tab and Shift-Control-Tab always 9017db96d56Sopenharmony_ci # works (here at least). 9027db96d56Sopenharmony_ci self.tk.call("ttk::notebook::enableTraversal", self._w) 9037db96d56Sopenharmony_ci 9047db96d56Sopenharmony_ci 9057db96d56Sopenharmony_ciclass Panedwindow(Widget, tkinter.PanedWindow): 9067db96d56Sopenharmony_ci """Ttk Panedwindow widget displays a number of subwindows, stacked 9077db96d56Sopenharmony_ci either vertically or horizontally.""" 9087db96d56Sopenharmony_ci 9097db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 9107db96d56Sopenharmony_ci """Construct a Ttk Panedwindow with parent master. 9117db96d56Sopenharmony_ci 9127db96d56Sopenharmony_ci STANDARD OPTIONS 9137db96d56Sopenharmony_ci 9147db96d56Sopenharmony_ci class, cursor, style, takefocus 9157db96d56Sopenharmony_ci 9167db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 9177db96d56Sopenharmony_ci 9187db96d56Sopenharmony_ci orient, width, height 9197db96d56Sopenharmony_ci 9207db96d56Sopenharmony_ci PANE OPTIONS 9217db96d56Sopenharmony_ci 9227db96d56Sopenharmony_ci weight 9237db96d56Sopenharmony_ci """ 9247db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::panedwindow", kw) 9257db96d56Sopenharmony_ci 9267db96d56Sopenharmony_ci 9277db96d56Sopenharmony_ci forget = tkinter.PanedWindow.forget # overrides Pack.forget 9287db96d56Sopenharmony_ci 9297db96d56Sopenharmony_ci 9307db96d56Sopenharmony_ci def insert(self, pos, child, **kw): 9317db96d56Sopenharmony_ci """Inserts a pane at the specified positions. 9327db96d56Sopenharmony_ci 9337db96d56Sopenharmony_ci pos is either the string end, and integer index, or the name 9347db96d56Sopenharmony_ci of a child. If child is already managed by the paned window, 9357db96d56Sopenharmony_ci moves it to the specified position.""" 9367db96d56Sopenharmony_ci self.tk.call(self._w, "insert", pos, child, *(_format_optdict(kw))) 9377db96d56Sopenharmony_ci 9387db96d56Sopenharmony_ci 9397db96d56Sopenharmony_ci def pane(self, pane, option=None, **kw): 9407db96d56Sopenharmony_ci """Query or modify the options of the specified pane. 9417db96d56Sopenharmony_ci 9427db96d56Sopenharmony_ci pane is either an integer index or the name of a managed subwindow. 9437db96d56Sopenharmony_ci If kw is not given, returns a dict of the pane option values. If 9447db96d56Sopenharmony_ci option is specified then the value for that option is returned. 9457db96d56Sopenharmony_ci Otherwise, sets the options to the corresponding values.""" 9467db96d56Sopenharmony_ci if option is not None: 9477db96d56Sopenharmony_ci kw[option] = None 9487db96d56Sopenharmony_ci return _val_or_dict(self.tk, kw, self._w, "pane", pane) 9497db96d56Sopenharmony_ci 9507db96d56Sopenharmony_ci 9517db96d56Sopenharmony_ci def sashpos(self, index, newpos=None): 9527db96d56Sopenharmony_ci """If newpos is specified, sets the position of sash number index. 9537db96d56Sopenharmony_ci 9547db96d56Sopenharmony_ci May adjust the positions of adjacent sashes to ensure that 9557db96d56Sopenharmony_ci positions are monotonically increasing. Sash positions are further 9567db96d56Sopenharmony_ci constrained to be between 0 and the total size of the widget. 9577db96d56Sopenharmony_ci 9587db96d56Sopenharmony_ci Returns the new position of sash number index.""" 9597db96d56Sopenharmony_ci return self.tk.getint(self.tk.call(self._w, "sashpos", index, newpos)) 9607db96d56Sopenharmony_ci 9617db96d56Sopenharmony_ciPanedWindow = Panedwindow # tkinter name compatibility 9627db96d56Sopenharmony_ci 9637db96d56Sopenharmony_ci 9647db96d56Sopenharmony_ciclass Progressbar(Widget): 9657db96d56Sopenharmony_ci """Ttk Progressbar widget shows the status of a long-running 9667db96d56Sopenharmony_ci operation. They can operate in two modes: determinate mode shows the 9677db96d56Sopenharmony_ci amount completed relative to the total amount of work to be done, and 9687db96d56Sopenharmony_ci indeterminate mode provides an animated display to let the user know 9697db96d56Sopenharmony_ci that something is happening.""" 9707db96d56Sopenharmony_ci 9717db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 9727db96d56Sopenharmony_ci """Construct a Ttk Progressbar with parent master. 9737db96d56Sopenharmony_ci 9747db96d56Sopenharmony_ci STANDARD OPTIONS 9757db96d56Sopenharmony_ci 9767db96d56Sopenharmony_ci class, cursor, style, takefocus 9777db96d56Sopenharmony_ci 9787db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 9797db96d56Sopenharmony_ci 9807db96d56Sopenharmony_ci orient, length, mode, maximum, value, variable, phase 9817db96d56Sopenharmony_ci """ 9827db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::progressbar", kw) 9837db96d56Sopenharmony_ci 9847db96d56Sopenharmony_ci 9857db96d56Sopenharmony_ci def start(self, interval=None): 9867db96d56Sopenharmony_ci """Begin autoincrement mode: schedules a recurring timer event 9877db96d56Sopenharmony_ci that calls method step every interval milliseconds. 9887db96d56Sopenharmony_ci 9897db96d56Sopenharmony_ci interval defaults to 50 milliseconds (20 steps/second) if omitted.""" 9907db96d56Sopenharmony_ci self.tk.call(self._w, "start", interval) 9917db96d56Sopenharmony_ci 9927db96d56Sopenharmony_ci 9937db96d56Sopenharmony_ci def step(self, amount=None): 9947db96d56Sopenharmony_ci """Increments the value option by amount. 9957db96d56Sopenharmony_ci 9967db96d56Sopenharmony_ci amount defaults to 1.0 if omitted.""" 9977db96d56Sopenharmony_ci self.tk.call(self._w, "step", amount) 9987db96d56Sopenharmony_ci 9997db96d56Sopenharmony_ci 10007db96d56Sopenharmony_ci def stop(self): 10017db96d56Sopenharmony_ci """Stop autoincrement mode: cancels any recurring timer event 10027db96d56Sopenharmony_ci initiated by start.""" 10037db96d56Sopenharmony_ci self.tk.call(self._w, "stop") 10047db96d56Sopenharmony_ci 10057db96d56Sopenharmony_ci 10067db96d56Sopenharmony_ciclass Radiobutton(Widget): 10077db96d56Sopenharmony_ci """Ttk Radiobutton widgets are used in groups to show or change a 10087db96d56Sopenharmony_ci set of mutually-exclusive options.""" 10097db96d56Sopenharmony_ci 10107db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 10117db96d56Sopenharmony_ci """Construct a Ttk Radiobutton with parent master. 10127db96d56Sopenharmony_ci 10137db96d56Sopenharmony_ci STANDARD OPTIONS 10147db96d56Sopenharmony_ci 10157db96d56Sopenharmony_ci class, compound, cursor, image, state, style, takefocus, 10167db96d56Sopenharmony_ci text, textvariable, underline, width 10177db96d56Sopenharmony_ci 10187db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 10197db96d56Sopenharmony_ci 10207db96d56Sopenharmony_ci command, value, variable 10217db96d56Sopenharmony_ci """ 10227db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::radiobutton", kw) 10237db96d56Sopenharmony_ci 10247db96d56Sopenharmony_ci 10257db96d56Sopenharmony_ci def invoke(self): 10267db96d56Sopenharmony_ci """Sets the option variable to the option value, selects the 10277db96d56Sopenharmony_ci widget, and invokes the associated command. 10287db96d56Sopenharmony_ci 10297db96d56Sopenharmony_ci Returns the result of the command, or an empty string if 10307db96d56Sopenharmony_ci no command is specified.""" 10317db96d56Sopenharmony_ci return self.tk.call(self._w, "invoke") 10327db96d56Sopenharmony_ci 10337db96d56Sopenharmony_ci 10347db96d56Sopenharmony_ciclass Scale(Widget, tkinter.Scale): 10357db96d56Sopenharmony_ci """Ttk Scale widget is typically used to control the numeric value of 10367db96d56Sopenharmony_ci a linked variable that varies uniformly over some range.""" 10377db96d56Sopenharmony_ci 10387db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 10397db96d56Sopenharmony_ci """Construct a Ttk Scale with parent master. 10407db96d56Sopenharmony_ci 10417db96d56Sopenharmony_ci STANDARD OPTIONS 10427db96d56Sopenharmony_ci 10437db96d56Sopenharmony_ci class, cursor, style, takefocus 10447db96d56Sopenharmony_ci 10457db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 10467db96d56Sopenharmony_ci 10477db96d56Sopenharmony_ci command, from, length, orient, to, value, variable 10487db96d56Sopenharmony_ci """ 10497db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::scale", kw) 10507db96d56Sopenharmony_ci 10517db96d56Sopenharmony_ci 10527db96d56Sopenharmony_ci def configure(self, cnf=None, **kw): 10537db96d56Sopenharmony_ci """Modify or query scale options. 10547db96d56Sopenharmony_ci 10557db96d56Sopenharmony_ci Setting a value for any of the "from", "from_" or "to" options 10567db96d56Sopenharmony_ci generates a <<RangeChanged>> event.""" 10577db96d56Sopenharmony_ci retval = Widget.configure(self, cnf, **kw) 10587db96d56Sopenharmony_ci if not isinstance(cnf, (type(None), str)): 10597db96d56Sopenharmony_ci kw.update(cnf) 10607db96d56Sopenharmony_ci if any(['from' in kw, 'from_' in kw, 'to' in kw]): 10617db96d56Sopenharmony_ci self.event_generate('<<RangeChanged>>') 10627db96d56Sopenharmony_ci return retval 10637db96d56Sopenharmony_ci 10647db96d56Sopenharmony_ci 10657db96d56Sopenharmony_ci def get(self, x=None, y=None): 10667db96d56Sopenharmony_ci """Get the current value of the value option, or the value 10677db96d56Sopenharmony_ci corresponding to the coordinates x, y if they are specified. 10687db96d56Sopenharmony_ci 10697db96d56Sopenharmony_ci x and y are pixel coordinates relative to the scale widget 10707db96d56Sopenharmony_ci origin.""" 10717db96d56Sopenharmony_ci return self.tk.call(self._w, 'get', x, y) 10727db96d56Sopenharmony_ci 10737db96d56Sopenharmony_ci 10747db96d56Sopenharmony_ciclass Scrollbar(Widget, tkinter.Scrollbar): 10757db96d56Sopenharmony_ci """Ttk Scrollbar controls the viewport of a scrollable widget.""" 10767db96d56Sopenharmony_ci 10777db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 10787db96d56Sopenharmony_ci """Construct a Ttk Scrollbar with parent master. 10797db96d56Sopenharmony_ci 10807db96d56Sopenharmony_ci STANDARD OPTIONS 10817db96d56Sopenharmony_ci 10827db96d56Sopenharmony_ci class, cursor, style, takefocus 10837db96d56Sopenharmony_ci 10847db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 10857db96d56Sopenharmony_ci 10867db96d56Sopenharmony_ci command, orient 10877db96d56Sopenharmony_ci """ 10887db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::scrollbar", kw) 10897db96d56Sopenharmony_ci 10907db96d56Sopenharmony_ci 10917db96d56Sopenharmony_ciclass Separator(Widget): 10927db96d56Sopenharmony_ci """Ttk Separator widget displays a horizontal or vertical separator 10937db96d56Sopenharmony_ci bar.""" 10947db96d56Sopenharmony_ci 10957db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 10967db96d56Sopenharmony_ci """Construct a Ttk Separator with parent master. 10977db96d56Sopenharmony_ci 10987db96d56Sopenharmony_ci STANDARD OPTIONS 10997db96d56Sopenharmony_ci 11007db96d56Sopenharmony_ci class, cursor, style, takefocus 11017db96d56Sopenharmony_ci 11027db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 11037db96d56Sopenharmony_ci 11047db96d56Sopenharmony_ci orient 11057db96d56Sopenharmony_ci """ 11067db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::separator", kw) 11077db96d56Sopenharmony_ci 11087db96d56Sopenharmony_ci 11097db96d56Sopenharmony_ciclass Sizegrip(Widget): 11107db96d56Sopenharmony_ci """Ttk Sizegrip allows the user to resize the containing toplevel 11117db96d56Sopenharmony_ci window by pressing and dragging the grip.""" 11127db96d56Sopenharmony_ci 11137db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 11147db96d56Sopenharmony_ci """Construct a Ttk Sizegrip with parent master. 11157db96d56Sopenharmony_ci 11167db96d56Sopenharmony_ci STANDARD OPTIONS 11177db96d56Sopenharmony_ci 11187db96d56Sopenharmony_ci class, cursor, state, style, takefocus 11197db96d56Sopenharmony_ci """ 11207db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::sizegrip", kw) 11217db96d56Sopenharmony_ci 11227db96d56Sopenharmony_ci 11237db96d56Sopenharmony_ciclass Spinbox(Entry): 11247db96d56Sopenharmony_ci """Ttk Spinbox is an Entry with increment and decrement arrows 11257db96d56Sopenharmony_ci 11267db96d56Sopenharmony_ci It is commonly used for number entry or to select from a list of 11277db96d56Sopenharmony_ci string values. 11287db96d56Sopenharmony_ci """ 11297db96d56Sopenharmony_ci 11307db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 11317db96d56Sopenharmony_ci """Construct a Ttk Spinbox widget with the parent master. 11327db96d56Sopenharmony_ci 11337db96d56Sopenharmony_ci STANDARD OPTIONS 11347db96d56Sopenharmony_ci 11357db96d56Sopenharmony_ci class, cursor, style, takefocus, validate, 11367db96d56Sopenharmony_ci validatecommand, xscrollcommand, invalidcommand 11377db96d56Sopenharmony_ci 11387db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 11397db96d56Sopenharmony_ci 11407db96d56Sopenharmony_ci to, from_, increment, values, wrap, format, command 11417db96d56Sopenharmony_ci """ 11427db96d56Sopenharmony_ci Entry.__init__(self, master, "ttk::spinbox", **kw) 11437db96d56Sopenharmony_ci 11447db96d56Sopenharmony_ci 11457db96d56Sopenharmony_ci def set(self, value): 11467db96d56Sopenharmony_ci """Sets the value of the Spinbox to value.""" 11477db96d56Sopenharmony_ci self.tk.call(self._w, "set", value) 11487db96d56Sopenharmony_ci 11497db96d56Sopenharmony_ci 11507db96d56Sopenharmony_ciclass Treeview(Widget, tkinter.XView, tkinter.YView): 11517db96d56Sopenharmony_ci """Ttk Treeview widget displays a hierarchical collection of items. 11527db96d56Sopenharmony_ci 11537db96d56Sopenharmony_ci Each item has a textual label, an optional image, and an optional list 11547db96d56Sopenharmony_ci of data values. The data values are displayed in successive columns 11557db96d56Sopenharmony_ci after the tree label.""" 11567db96d56Sopenharmony_ci 11577db96d56Sopenharmony_ci def __init__(self, master=None, **kw): 11587db96d56Sopenharmony_ci """Construct a Ttk Treeview with parent master. 11597db96d56Sopenharmony_ci 11607db96d56Sopenharmony_ci STANDARD OPTIONS 11617db96d56Sopenharmony_ci 11627db96d56Sopenharmony_ci class, cursor, style, takefocus, xscrollcommand, 11637db96d56Sopenharmony_ci yscrollcommand 11647db96d56Sopenharmony_ci 11657db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 11667db96d56Sopenharmony_ci 11677db96d56Sopenharmony_ci columns, displaycolumns, height, padding, selectmode, show 11687db96d56Sopenharmony_ci 11697db96d56Sopenharmony_ci ITEM OPTIONS 11707db96d56Sopenharmony_ci 11717db96d56Sopenharmony_ci text, image, values, open, tags 11727db96d56Sopenharmony_ci 11737db96d56Sopenharmony_ci TAG OPTIONS 11747db96d56Sopenharmony_ci 11757db96d56Sopenharmony_ci foreground, background, font, image 11767db96d56Sopenharmony_ci """ 11777db96d56Sopenharmony_ci Widget.__init__(self, master, "ttk::treeview", kw) 11787db96d56Sopenharmony_ci 11797db96d56Sopenharmony_ci 11807db96d56Sopenharmony_ci def bbox(self, item, column=None): 11817db96d56Sopenharmony_ci """Returns the bounding box (relative to the treeview widget's 11827db96d56Sopenharmony_ci window) of the specified item in the form x y width height. 11837db96d56Sopenharmony_ci 11847db96d56Sopenharmony_ci If column is specified, returns the bounding box of that cell. 11857db96d56Sopenharmony_ci If the item is not visible (i.e., if it is a descendant of a 11867db96d56Sopenharmony_ci closed item or is scrolled offscreen), returns an empty string.""" 11877db96d56Sopenharmony_ci return self._getints(self.tk.call(self._w, "bbox", item, column)) or '' 11887db96d56Sopenharmony_ci 11897db96d56Sopenharmony_ci 11907db96d56Sopenharmony_ci def get_children(self, item=None): 11917db96d56Sopenharmony_ci """Returns a tuple of children belonging to item. 11927db96d56Sopenharmony_ci 11937db96d56Sopenharmony_ci If item is not specified, returns root children.""" 11947db96d56Sopenharmony_ci return self.tk.splitlist( 11957db96d56Sopenharmony_ci self.tk.call(self._w, "children", item or '') or ()) 11967db96d56Sopenharmony_ci 11977db96d56Sopenharmony_ci 11987db96d56Sopenharmony_ci def set_children(self, item, *newchildren): 11997db96d56Sopenharmony_ci """Replaces item's child with newchildren. 12007db96d56Sopenharmony_ci 12017db96d56Sopenharmony_ci Children present in item that are not present in newchildren 12027db96d56Sopenharmony_ci are detached from tree. No items in newchildren may be an 12037db96d56Sopenharmony_ci ancestor of item.""" 12047db96d56Sopenharmony_ci self.tk.call(self._w, "children", item, newchildren) 12057db96d56Sopenharmony_ci 12067db96d56Sopenharmony_ci 12077db96d56Sopenharmony_ci def column(self, column, option=None, **kw): 12087db96d56Sopenharmony_ci """Query or modify the options for the specified column. 12097db96d56Sopenharmony_ci 12107db96d56Sopenharmony_ci If kw is not given, returns a dict of the column option values. If 12117db96d56Sopenharmony_ci option is specified then the value for that option is returned. 12127db96d56Sopenharmony_ci Otherwise, sets the options to the corresponding values.""" 12137db96d56Sopenharmony_ci if option is not None: 12147db96d56Sopenharmony_ci kw[option] = None 12157db96d56Sopenharmony_ci return _val_or_dict(self.tk, kw, self._w, "column", column) 12167db96d56Sopenharmony_ci 12177db96d56Sopenharmony_ci 12187db96d56Sopenharmony_ci def delete(self, *items): 12197db96d56Sopenharmony_ci """Delete all specified items and all their descendants. The root 12207db96d56Sopenharmony_ci item may not be deleted.""" 12217db96d56Sopenharmony_ci self.tk.call(self._w, "delete", items) 12227db96d56Sopenharmony_ci 12237db96d56Sopenharmony_ci 12247db96d56Sopenharmony_ci def detach(self, *items): 12257db96d56Sopenharmony_ci """Unlinks all of the specified items from the tree. 12267db96d56Sopenharmony_ci 12277db96d56Sopenharmony_ci The items and all of their descendants are still present, and may 12287db96d56Sopenharmony_ci be reinserted at another point in the tree, but will not be 12297db96d56Sopenharmony_ci displayed. The root item may not be detached.""" 12307db96d56Sopenharmony_ci self.tk.call(self._w, "detach", items) 12317db96d56Sopenharmony_ci 12327db96d56Sopenharmony_ci 12337db96d56Sopenharmony_ci def exists(self, item): 12347db96d56Sopenharmony_ci """Returns True if the specified item is present in the tree, 12357db96d56Sopenharmony_ci False otherwise.""" 12367db96d56Sopenharmony_ci return self.tk.getboolean(self.tk.call(self._w, "exists", item)) 12377db96d56Sopenharmony_ci 12387db96d56Sopenharmony_ci 12397db96d56Sopenharmony_ci def focus(self, item=None): 12407db96d56Sopenharmony_ci """If item is specified, sets the focus item to item. Otherwise, 12417db96d56Sopenharmony_ci returns the current focus item, or '' if there is none.""" 12427db96d56Sopenharmony_ci return self.tk.call(self._w, "focus", item) 12437db96d56Sopenharmony_ci 12447db96d56Sopenharmony_ci 12457db96d56Sopenharmony_ci def heading(self, column, option=None, **kw): 12467db96d56Sopenharmony_ci """Query or modify the heading options for the specified column. 12477db96d56Sopenharmony_ci 12487db96d56Sopenharmony_ci If kw is not given, returns a dict of the heading option values. If 12497db96d56Sopenharmony_ci option is specified then the value for that option is returned. 12507db96d56Sopenharmony_ci Otherwise, sets the options to the corresponding values. 12517db96d56Sopenharmony_ci 12527db96d56Sopenharmony_ci Valid options/values are: 12537db96d56Sopenharmony_ci text: text 12547db96d56Sopenharmony_ci The text to display in the column heading 12557db96d56Sopenharmony_ci image: image_name 12567db96d56Sopenharmony_ci Specifies an image to display to the right of the column 12577db96d56Sopenharmony_ci heading 12587db96d56Sopenharmony_ci anchor: anchor 12597db96d56Sopenharmony_ci Specifies how the heading text should be aligned. One of 12607db96d56Sopenharmony_ci the standard Tk anchor values 12617db96d56Sopenharmony_ci command: callback 12627db96d56Sopenharmony_ci A callback to be invoked when the heading label is 12637db96d56Sopenharmony_ci pressed. 12647db96d56Sopenharmony_ci 12657db96d56Sopenharmony_ci To configure the tree column heading, call this with column = "#0" """ 12667db96d56Sopenharmony_ci cmd = kw.get('command') 12677db96d56Sopenharmony_ci if cmd and not isinstance(cmd, str): 12687db96d56Sopenharmony_ci # callback not registered yet, do it now 12697db96d56Sopenharmony_ci kw['command'] = self.master.register(cmd, self._substitute) 12707db96d56Sopenharmony_ci 12717db96d56Sopenharmony_ci if option is not None: 12727db96d56Sopenharmony_ci kw[option] = None 12737db96d56Sopenharmony_ci 12747db96d56Sopenharmony_ci return _val_or_dict(self.tk, kw, self._w, 'heading', column) 12757db96d56Sopenharmony_ci 12767db96d56Sopenharmony_ci 12777db96d56Sopenharmony_ci def identify(self, component, x, y): 12787db96d56Sopenharmony_ci """Returns a description of the specified component under the 12797db96d56Sopenharmony_ci point given by x and y, or the empty string if no such component 12807db96d56Sopenharmony_ci is present at that position.""" 12817db96d56Sopenharmony_ci return self.tk.call(self._w, "identify", component, x, y) 12827db96d56Sopenharmony_ci 12837db96d56Sopenharmony_ci 12847db96d56Sopenharmony_ci def identify_row(self, y): 12857db96d56Sopenharmony_ci """Returns the item ID of the item at position y.""" 12867db96d56Sopenharmony_ci return self.identify("row", 0, y) 12877db96d56Sopenharmony_ci 12887db96d56Sopenharmony_ci 12897db96d56Sopenharmony_ci def identify_column(self, x): 12907db96d56Sopenharmony_ci """Returns the data column identifier of the cell at position x. 12917db96d56Sopenharmony_ci 12927db96d56Sopenharmony_ci The tree column has ID #0.""" 12937db96d56Sopenharmony_ci return self.identify("column", x, 0) 12947db96d56Sopenharmony_ci 12957db96d56Sopenharmony_ci 12967db96d56Sopenharmony_ci def identify_region(self, x, y): 12977db96d56Sopenharmony_ci """Returns one of: 12987db96d56Sopenharmony_ci 12997db96d56Sopenharmony_ci heading: Tree heading area. 13007db96d56Sopenharmony_ci separator: Space between two columns headings; 13017db96d56Sopenharmony_ci tree: The tree area. 13027db96d56Sopenharmony_ci cell: A data cell. 13037db96d56Sopenharmony_ci 13047db96d56Sopenharmony_ci * Availability: Tk 8.6""" 13057db96d56Sopenharmony_ci return self.identify("region", x, y) 13067db96d56Sopenharmony_ci 13077db96d56Sopenharmony_ci 13087db96d56Sopenharmony_ci def identify_element(self, x, y): 13097db96d56Sopenharmony_ci """Returns the element at position x, y. 13107db96d56Sopenharmony_ci 13117db96d56Sopenharmony_ci * Availability: Tk 8.6""" 13127db96d56Sopenharmony_ci return self.identify("element", x, y) 13137db96d56Sopenharmony_ci 13147db96d56Sopenharmony_ci 13157db96d56Sopenharmony_ci def index(self, item): 13167db96d56Sopenharmony_ci """Returns the integer index of item within its parent's list 13177db96d56Sopenharmony_ci of children.""" 13187db96d56Sopenharmony_ci return self.tk.getint(self.tk.call(self._w, "index", item)) 13197db96d56Sopenharmony_ci 13207db96d56Sopenharmony_ci 13217db96d56Sopenharmony_ci def insert(self, parent, index, iid=None, **kw): 13227db96d56Sopenharmony_ci """Creates a new item and return the item identifier of the newly 13237db96d56Sopenharmony_ci created item. 13247db96d56Sopenharmony_ci 13257db96d56Sopenharmony_ci parent is the item ID of the parent item, or the empty string 13267db96d56Sopenharmony_ci to create a new top-level item. index is an integer, or the value 13277db96d56Sopenharmony_ci end, specifying where in the list of parent's children to insert 13287db96d56Sopenharmony_ci the new item. If index is less than or equal to zero, the new node 13297db96d56Sopenharmony_ci is inserted at the beginning, if index is greater than or equal to 13307db96d56Sopenharmony_ci the current number of children, it is inserted at the end. If iid 13317db96d56Sopenharmony_ci is specified, it is used as the item identifier, iid must not 13327db96d56Sopenharmony_ci already exist in the tree. Otherwise, a new unique identifier 13337db96d56Sopenharmony_ci is generated.""" 13347db96d56Sopenharmony_ci opts = _format_optdict(kw) 13357db96d56Sopenharmony_ci if iid is not None: 13367db96d56Sopenharmony_ci res = self.tk.call(self._w, "insert", parent, index, 13377db96d56Sopenharmony_ci "-id", iid, *opts) 13387db96d56Sopenharmony_ci else: 13397db96d56Sopenharmony_ci res = self.tk.call(self._w, "insert", parent, index, *opts) 13407db96d56Sopenharmony_ci 13417db96d56Sopenharmony_ci return res 13427db96d56Sopenharmony_ci 13437db96d56Sopenharmony_ci 13447db96d56Sopenharmony_ci def item(self, item, option=None, **kw): 13457db96d56Sopenharmony_ci """Query or modify the options for the specified item. 13467db96d56Sopenharmony_ci 13477db96d56Sopenharmony_ci If no options are given, a dict with options/values for the item 13487db96d56Sopenharmony_ci is returned. If option is specified then the value for that option 13497db96d56Sopenharmony_ci is returned. Otherwise, sets the options to the corresponding 13507db96d56Sopenharmony_ci values as given by kw.""" 13517db96d56Sopenharmony_ci if option is not None: 13527db96d56Sopenharmony_ci kw[option] = None 13537db96d56Sopenharmony_ci return _val_or_dict(self.tk, kw, self._w, "item", item) 13547db96d56Sopenharmony_ci 13557db96d56Sopenharmony_ci 13567db96d56Sopenharmony_ci def move(self, item, parent, index): 13577db96d56Sopenharmony_ci """Moves item to position index in parent's list of children. 13587db96d56Sopenharmony_ci 13597db96d56Sopenharmony_ci It is illegal to move an item under one of its descendants. If 13607db96d56Sopenharmony_ci index is less than or equal to zero, item is moved to the 13617db96d56Sopenharmony_ci beginning, if greater than or equal to the number of children, 13627db96d56Sopenharmony_ci it is moved to the end. If item was detached it is reattached.""" 13637db96d56Sopenharmony_ci self.tk.call(self._w, "move", item, parent, index) 13647db96d56Sopenharmony_ci 13657db96d56Sopenharmony_ci reattach = move # A sensible method name for reattaching detached items 13667db96d56Sopenharmony_ci 13677db96d56Sopenharmony_ci 13687db96d56Sopenharmony_ci def next(self, item): 13697db96d56Sopenharmony_ci """Returns the identifier of item's next sibling, or '' if item 13707db96d56Sopenharmony_ci is the last child of its parent.""" 13717db96d56Sopenharmony_ci return self.tk.call(self._w, "next", item) 13727db96d56Sopenharmony_ci 13737db96d56Sopenharmony_ci 13747db96d56Sopenharmony_ci def parent(self, item): 13757db96d56Sopenharmony_ci """Returns the ID of the parent of item, or '' if item is at the 13767db96d56Sopenharmony_ci top level of the hierarchy.""" 13777db96d56Sopenharmony_ci return self.tk.call(self._w, "parent", item) 13787db96d56Sopenharmony_ci 13797db96d56Sopenharmony_ci 13807db96d56Sopenharmony_ci def prev(self, item): 13817db96d56Sopenharmony_ci """Returns the identifier of item's previous sibling, or '' if 13827db96d56Sopenharmony_ci item is the first child of its parent.""" 13837db96d56Sopenharmony_ci return self.tk.call(self._w, "prev", item) 13847db96d56Sopenharmony_ci 13857db96d56Sopenharmony_ci 13867db96d56Sopenharmony_ci def see(self, item): 13877db96d56Sopenharmony_ci """Ensure that item is visible. 13887db96d56Sopenharmony_ci 13897db96d56Sopenharmony_ci Sets all of item's ancestors open option to True, and scrolls 13907db96d56Sopenharmony_ci the widget if necessary so that item is within the visible 13917db96d56Sopenharmony_ci portion of the tree.""" 13927db96d56Sopenharmony_ci self.tk.call(self._w, "see", item) 13937db96d56Sopenharmony_ci 13947db96d56Sopenharmony_ci 13957db96d56Sopenharmony_ci def selection(self): 13967db96d56Sopenharmony_ci """Returns the tuple of selected items.""" 13977db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call(self._w, "selection")) 13987db96d56Sopenharmony_ci 13997db96d56Sopenharmony_ci 14007db96d56Sopenharmony_ci def _selection(self, selop, items): 14017db96d56Sopenharmony_ci if len(items) == 1 and isinstance(items[0], (tuple, list)): 14027db96d56Sopenharmony_ci items = items[0] 14037db96d56Sopenharmony_ci 14047db96d56Sopenharmony_ci self.tk.call(self._w, "selection", selop, items) 14057db96d56Sopenharmony_ci 14067db96d56Sopenharmony_ci 14077db96d56Sopenharmony_ci def selection_set(self, *items): 14087db96d56Sopenharmony_ci """The specified items becomes the new selection.""" 14097db96d56Sopenharmony_ci self._selection("set", items) 14107db96d56Sopenharmony_ci 14117db96d56Sopenharmony_ci 14127db96d56Sopenharmony_ci def selection_add(self, *items): 14137db96d56Sopenharmony_ci """Add all of the specified items to the selection.""" 14147db96d56Sopenharmony_ci self._selection("add", items) 14157db96d56Sopenharmony_ci 14167db96d56Sopenharmony_ci 14177db96d56Sopenharmony_ci def selection_remove(self, *items): 14187db96d56Sopenharmony_ci """Remove all of the specified items from the selection.""" 14197db96d56Sopenharmony_ci self._selection("remove", items) 14207db96d56Sopenharmony_ci 14217db96d56Sopenharmony_ci 14227db96d56Sopenharmony_ci def selection_toggle(self, *items): 14237db96d56Sopenharmony_ci """Toggle the selection state of each specified item.""" 14247db96d56Sopenharmony_ci self._selection("toggle", items) 14257db96d56Sopenharmony_ci 14267db96d56Sopenharmony_ci 14277db96d56Sopenharmony_ci def set(self, item, column=None, value=None): 14287db96d56Sopenharmony_ci """Query or set the value of given item. 14297db96d56Sopenharmony_ci 14307db96d56Sopenharmony_ci With one argument, return a dictionary of column/value pairs 14317db96d56Sopenharmony_ci for the specified item. With two arguments, return the current 14327db96d56Sopenharmony_ci value of the specified column. With three arguments, set the 14337db96d56Sopenharmony_ci value of given column in given item to the specified value.""" 14347db96d56Sopenharmony_ci res = self.tk.call(self._w, "set", item, column, value) 14357db96d56Sopenharmony_ci if column is None and value is None: 14367db96d56Sopenharmony_ci return _splitdict(self.tk, res, 14377db96d56Sopenharmony_ci cut_minus=False, conv=_tclobj_to_py) 14387db96d56Sopenharmony_ci else: 14397db96d56Sopenharmony_ci return res 14407db96d56Sopenharmony_ci 14417db96d56Sopenharmony_ci 14427db96d56Sopenharmony_ci def tag_bind(self, tagname, sequence=None, callback=None): 14437db96d56Sopenharmony_ci """Bind a callback for the given event sequence to the tag tagname. 14447db96d56Sopenharmony_ci When an event is delivered to an item, the callbacks for each 14457db96d56Sopenharmony_ci of the item's tags option are called.""" 14467db96d56Sopenharmony_ci self._bind((self._w, "tag", "bind", tagname), sequence, callback, add=0) 14477db96d56Sopenharmony_ci 14487db96d56Sopenharmony_ci 14497db96d56Sopenharmony_ci def tag_configure(self, tagname, option=None, **kw): 14507db96d56Sopenharmony_ci """Query or modify the options for the specified tagname. 14517db96d56Sopenharmony_ci 14527db96d56Sopenharmony_ci If kw is not given, returns a dict of the option settings for tagname. 14537db96d56Sopenharmony_ci If option is specified, returns the value for that option for the 14547db96d56Sopenharmony_ci specified tagname. Otherwise, sets the options to the corresponding 14557db96d56Sopenharmony_ci values for the given tagname.""" 14567db96d56Sopenharmony_ci if option is not None: 14577db96d56Sopenharmony_ci kw[option] = None 14587db96d56Sopenharmony_ci return _val_or_dict(self.tk, kw, self._w, "tag", "configure", 14597db96d56Sopenharmony_ci tagname) 14607db96d56Sopenharmony_ci 14617db96d56Sopenharmony_ci 14627db96d56Sopenharmony_ci def tag_has(self, tagname, item=None): 14637db96d56Sopenharmony_ci """If item is specified, returns 1 or 0 depending on whether the 14647db96d56Sopenharmony_ci specified item has the given tagname. Otherwise, returns a list of 14657db96d56Sopenharmony_ci all items which have the specified tag. 14667db96d56Sopenharmony_ci 14677db96d56Sopenharmony_ci * Availability: Tk 8.6""" 14687db96d56Sopenharmony_ci if item is None: 14697db96d56Sopenharmony_ci return self.tk.splitlist( 14707db96d56Sopenharmony_ci self.tk.call(self._w, "tag", "has", tagname)) 14717db96d56Sopenharmony_ci else: 14727db96d56Sopenharmony_ci return self.tk.getboolean( 14737db96d56Sopenharmony_ci self.tk.call(self._w, "tag", "has", tagname, item)) 14747db96d56Sopenharmony_ci 14757db96d56Sopenharmony_ci 14767db96d56Sopenharmony_ci# Extensions 14777db96d56Sopenharmony_ci 14787db96d56Sopenharmony_ciclass LabeledScale(Frame): 14797db96d56Sopenharmony_ci """A Ttk Scale widget with a Ttk Label widget indicating its 14807db96d56Sopenharmony_ci current value. 14817db96d56Sopenharmony_ci 14827db96d56Sopenharmony_ci The Ttk Scale can be accessed through instance.scale, and Ttk Label 14837db96d56Sopenharmony_ci can be accessed through instance.label""" 14847db96d56Sopenharmony_ci 14857db96d56Sopenharmony_ci def __init__(self, master=None, variable=None, from_=0, to=10, **kw): 14867db96d56Sopenharmony_ci """Construct a horizontal LabeledScale with parent master, a 14877db96d56Sopenharmony_ci variable to be associated with the Ttk Scale widget and its range. 14887db96d56Sopenharmony_ci If variable is not specified, a tkinter.IntVar is created. 14897db96d56Sopenharmony_ci 14907db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 14917db96d56Sopenharmony_ci 14927db96d56Sopenharmony_ci compound: 'top' or 'bottom' 14937db96d56Sopenharmony_ci Specifies how to display the label relative to the scale. 14947db96d56Sopenharmony_ci Defaults to 'top'. 14957db96d56Sopenharmony_ci """ 14967db96d56Sopenharmony_ci self._label_top = kw.pop('compound', 'top') == 'top' 14977db96d56Sopenharmony_ci 14987db96d56Sopenharmony_ci Frame.__init__(self, master, **kw) 14997db96d56Sopenharmony_ci self._variable = variable or tkinter.IntVar(master) 15007db96d56Sopenharmony_ci self._variable.set(from_) 15017db96d56Sopenharmony_ci self._last_valid = from_ 15027db96d56Sopenharmony_ci 15037db96d56Sopenharmony_ci self.label = Label(self) 15047db96d56Sopenharmony_ci self.scale = Scale(self, variable=self._variable, from_=from_, to=to) 15057db96d56Sopenharmony_ci self.scale.bind('<<RangeChanged>>', self._adjust) 15067db96d56Sopenharmony_ci 15077db96d56Sopenharmony_ci # position scale and label according to the compound option 15087db96d56Sopenharmony_ci scale_side = 'bottom' if self._label_top else 'top' 15097db96d56Sopenharmony_ci label_side = 'top' if scale_side == 'bottom' else 'bottom' 15107db96d56Sopenharmony_ci self.scale.pack(side=scale_side, fill='x') 15117db96d56Sopenharmony_ci # Dummy required to make frame correct height 15127db96d56Sopenharmony_ci dummy = Label(self) 15137db96d56Sopenharmony_ci dummy.pack(side=label_side) 15147db96d56Sopenharmony_ci dummy.lower() 15157db96d56Sopenharmony_ci self.label.place(anchor='n' if label_side == 'top' else 's') 15167db96d56Sopenharmony_ci 15177db96d56Sopenharmony_ci # update the label as scale or variable changes 15187db96d56Sopenharmony_ci self.__tracecb = self._variable.trace_variable('w', self._adjust) 15197db96d56Sopenharmony_ci self.bind('<Configure>', self._adjust) 15207db96d56Sopenharmony_ci self.bind('<Map>', self._adjust) 15217db96d56Sopenharmony_ci 15227db96d56Sopenharmony_ci 15237db96d56Sopenharmony_ci def destroy(self): 15247db96d56Sopenharmony_ci """Destroy this widget and possibly its associated variable.""" 15257db96d56Sopenharmony_ci try: 15267db96d56Sopenharmony_ci self._variable.trace_vdelete('w', self.__tracecb) 15277db96d56Sopenharmony_ci except AttributeError: 15287db96d56Sopenharmony_ci pass 15297db96d56Sopenharmony_ci else: 15307db96d56Sopenharmony_ci del self._variable 15317db96d56Sopenharmony_ci super().destroy() 15327db96d56Sopenharmony_ci self.label = None 15337db96d56Sopenharmony_ci self.scale = None 15347db96d56Sopenharmony_ci 15357db96d56Sopenharmony_ci 15367db96d56Sopenharmony_ci def _adjust(self, *args): 15377db96d56Sopenharmony_ci """Adjust the label position according to the scale.""" 15387db96d56Sopenharmony_ci def adjust_label(): 15397db96d56Sopenharmony_ci self.update_idletasks() # "force" scale redraw 15407db96d56Sopenharmony_ci 15417db96d56Sopenharmony_ci x, y = self.scale.coords() 15427db96d56Sopenharmony_ci if self._label_top: 15437db96d56Sopenharmony_ci y = self.scale.winfo_y() - self.label.winfo_reqheight() 15447db96d56Sopenharmony_ci else: 15457db96d56Sopenharmony_ci y = self.scale.winfo_reqheight() + self.label.winfo_reqheight() 15467db96d56Sopenharmony_ci 15477db96d56Sopenharmony_ci self.label.place_configure(x=x, y=y) 15487db96d56Sopenharmony_ci 15497db96d56Sopenharmony_ci from_ = _to_number(self.scale['from']) 15507db96d56Sopenharmony_ci to = _to_number(self.scale['to']) 15517db96d56Sopenharmony_ci if to < from_: 15527db96d56Sopenharmony_ci from_, to = to, from_ 15537db96d56Sopenharmony_ci newval = self._variable.get() 15547db96d56Sopenharmony_ci if not from_ <= newval <= to: 15557db96d56Sopenharmony_ci # value outside range, set value back to the last valid one 15567db96d56Sopenharmony_ci self.value = self._last_valid 15577db96d56Sopenharmony_ci return 15587db96d56Sopenharmony_ci 15597db96d56Sopenharmony_ci self._last_valid = newval 15607db96d56Sopenharmony_ci self.label['text'] = newval 15617db96d56Sopenharmony_ci self.after_idle(adjust_label) 15627db96d56Sopenharmony_ci 15637db96d56Sopenharmony_ci @property 15647db96d56Sopenharmony_ci def value(self): 15657db96d56Sopenharmony_ci """Return current scale value.""" 15667db96d56Sopenharmony_ci return self._variable.get() 15677db96d56Sopenharmony_ci 15687db96d56Sopenharmony_ci @value.setter 15697db96d56Sopenharmony_ci def value(self, val): 15707db96d56Sopenharmony_ci """Set new scale value.""" 15717db96d56Sopenharmony_ci self._variable.set(val) 15727db96d56Sopenharmony_ci 15737db96d56Sopenharmony_ci 15747db96d56Sopenharmony_ciclass OptionMenu(Menubutton): 15757db96d56Sopenharmony_ci """Themed OptionMenu, based after tkinter's OptionMenu, which allows 15767db96d56Sopenharmony_ci the user to select a value from a menu.""" 15777db96d56Sopenharmony_ci 15787db96d56Sopenharmony_ci def __init__(self, master, variable, default=None, *values, **kwargs): 15797db96d56Sopenharmony_ci """Construct a themed OptionMenu widget with master as the parent, 15807db96d56Sopenharmony_ci the resource textvariable set to variable, the initially selected 15817db96d56Sopenharmony_ci value specified by the default parameter, the menu values given by 15827db96d56Sopenharmony_ci *values and additional keywords. 15837db96d56Sopenharmony_ci 15847db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 15857db96d56Sopenharmony_ci 15867db96d56Sopenharmony_ci style: stylename 15877db96d56Sopenharmony_ci Menubutton style. 15887db96d56Sopenharmony_ci direction: 'above', 'below', 'left', 'right', or 'flush' 15897db96d56Sopenharmony_ci Menubutton direction. 15907db96d56Sopenharmony_ci command: callback 15917db96d56Sopenharmony_ci A callback that will be invoked after selecting an item. 15927db96d56Sopenharmony_ci """ 15937db96d56Sopenharmony_ci kw = {'textvariable': variable, 'style': kwargs.pop('style', None), 15947db96d56Sopenharmony_ci 'direction': kwargs.pop('direction', None)} 15957db96d56Sopenharmony_ci Menubutton.__init__(self, master, **kw) 15967db96d56Sopenharmony_ci self['menu'] = tkinter.Menu(self, tearoff=False) 15977db96d56Sopenharmony_ci 15987db96d56Sopenharmony_ci self._variable = variable 15997db96d56Sopenharmony_ci self._callback = kwargs.pop('command', None) 16007db96d56Sopenharmony_ci if kwargs: 16017db96d56Sopenharmony_ci raise tkinter.TclError('unknown option -%s' % ( 16027db96d56Sopenharmony_ci next(iter(kwargs.keys())))) 16037db96d56Sopenharmony_ci 16047db96d56Sopenharmony_ci self.set_menu(default, *values) 16057db96d56Sopenharmony_ci 16067db96d56Sopenharmony_ci 16077db96d56Sopenharmony_ci def __getitem__(self, item): 16087db96d56Sopenharmony_ci if item == 'menu': 16097db96d56Sopenharmony_ci return self.nametowidget(Menubutton.__getitem__(self, item)) 16107db96d56Sopenharmony_ci 16117db96d56Sopenharmony_ci return Menubutton.__getitem__(self, item) 16127db96d56Sopenharmony_ci 16137db96d56Sopenharmony_ci 16147db96d56Sopenharmony_ci def set_menu(self, default=None, *values): 16157db96d56Sopenharmony_ci """Build a new menu of radiobuttons with *values and optionally 16167db96d56Sopenharmony_ci a default value.""" 16177db96d56Sopenharmony_ci menu = self['menu'] 16187db96d56Sopenharmony_ci menu.delete(0, 'end') 16197db96d56Sopenharmony_ci for val in values: 16207db96d56Sopenharmony_ci menu.add_radiobutton(label=val, 16217db96d56Sopenharmony_ci command=( 16227db96d56Sopenharmony_ci None if self._callback is None 16237db96d56Sopenharmony_ci else lambda val=val: self._callback(val) 16247db96d56Sopenharmony_ci ), 16257db96d56Sopenharmony_ci variable=self._variable) 16267db96d56Sopenharmony_ci 16277db96d56Sopenharmony_ci if default: 16287db96d56Sopenharmony_ci self._variable.set(default) 16297db96d56Sopenharmony_ci 16307db96d56Sopenharmony_ci 16317db96d56Sopenharmony_ci def destroy(self): 16327db96d56Sopenharmony_ci """Destroy this widget and its associated variable.""" 16337db96d56Sopenharmony_ci try: 16347db96d56Sopenharmony_ci del self._variable 16357db96d56Sopenharmony_ci except AttributeError: 16367db96d56Sopenharmony_ci pass 16377db96d56Sopenharmony_ci super().destroy() 1638