17db96d56Sopenharmony_ci"""Wrapper functions for Tcl/Tk. 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciTkinter provides classes which allow the display, positioning and 47db96d56Sopenharmony_cicontrol of widgets. Toplevel widgets are Tk and Toplevel. Other 57db96d56Sopenharmony_ciwidgets are Frame, Label, Entry, Text, Canvas, Button, Radiobutton, 67db96d56Sopenharmony_ciCheckbutton, Scale, Listbox, Scrollbar, OptionMenu, Spinbox 77db96d56Sopenharmony_ciLabelFrame and PanedWindow. 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ciProperties of the widgets are specified with keyword arguments. 107db96d56Sopenharmony_ciKeyword arguments have the same name as the corresponding resource 117db96d56Sopenharmony_ciunder Tk. 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ciWidgets are positioned with one of the geometry managers Place, Pack 147db96d56Sopenharmony_cior Grid. These managers can be called with methods place, pack, grid 157db96d56Sopenharmony_ciavailable in every Widget. 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ciActions are bound to events by resources (e.g. keyword argument 187db96d56Sopenharmony_cicommand) or with the method bind. 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ciExample (Hello, World): 217db96d56Sopenharmony_ciimport tkinter 227db96d56Sopenharmony_cifrom tkinter.constants import * 237db96d56Sopenharmony_citk = tkinter.Tk() 247db96d56Sopenharmony_ciframe = tkinter.Frame(tk, relief=RIDGE, borderwidth=2) 257db96d56Sopenharmony_ciframe.pack(fill=BOTH,expand=1) 267db96d56Sopenharmony_cilabel = tkinter.Label(frame, text="Hello, World") 277db96d56Sopenharmony_cilabel.pack(fill=X, expand=1) 287db96d56Sopenharmony_cibutton = tkinter.Button(frame,text="Exit",command=tk.destroy) 297db96d56Sopenharmony_cibutton.pack(side=BOTTOM) 307db96d56Sopenharmony_citk.mainloop() 317db96d56Sopenharmony_ci""" 327db96d56Sopenharmony_ci 337db96d56Sopenharmony_ciimport collections 347db96d56Sopenharmony_ciimport enum 357db96d56Sopenharmony_ciimport sys 367db96d56Sopenharmony_ciimport types 377db96d56Sopenharmony_ci 387db96d56Sopenharmony_ciimport _tkinter # If this fails your Python may not be configured for Tk 397db96d56Sopenharmony_ciTclError = _tkinter.TclError 407db96d56Sopenharmony_cifrom tkinter.constants import * 417db96d56Sopenharmony_ciimport re 427db96d56Sopenharmony_ci 437db96d56Sopenharmony_ciwantobjects = 1 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ciTkVersion = float(_tkinter.TK_VERSION) 467db96d56Sopenharmony_ciTclVersion = float(_tkinter.TCL_VERSION) 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ciREADABLE = _tkinter.READABLE 497db96d56Sopenharmony_ciWRITABLE = _tkinter.WRITABLE 507db96d56Sopenharmony_ciEXCEPTION = _tkinter.EXCEPTION 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ci_magic_re = re.compile(r'([\\{}])') 547db96d56Sopenharmony_ci_space_re = re.compile(r'([\s])', re.ASCII) 557db96d56Sopenharmony_ci 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_cidef _join(value): 587db96d56Sopenharmony_ci """Internal function.""" 597db96d56Sopenharmony_ci return ' '.join(map(_stringify, value)) 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_cidef _stringify(value): 637db96d56Sopenharmony_ci """Internal function.""" 647db96d56Sopenharmony_ci if isinstance(value, (list, tuple)): 657db96d56Sopenharmony_ci if len(value) == 1: 667db96d56Sopenharmony_ci value = _stringify(value[0]) 677db96d56Sopenharmony_ci if _magic_re.search(value): 687db96d56Sopenharmony_ci value = '{%s}' % value 697db96d56Sopenharmony_ci else: 707db96d56Sopenharmony_ci value = '{%s}' % _join(value) 717db96d56Sopenharmony_ci else: 727db96d56Sopenharmony_ci value = str(value) 737db96d56Sopenharmony_ci if not value: 747db96d56Sopenharmony_ci value = '{}' 757db96d56Sopenharmony_ci elif _magic_re.search(value): 767db96d56Sopenharmony_ci # add '\' before special characters and spaces 777db96d56Sopenharmony_ci value = _magic_re.sub(r'\\\1', value) 787db96d56Sopenharmony_ci value = value.replace('\n', r'\n') 797db96d56Sopenharmony_ci value = _space_re.sub(r'\\\1', value) 807db96d56Sopenharmony_ci if value[0] == '"': 817db96d56Sopenharmony_ci value = '\\' + value 827db96d56Sopenharmony_ci elif value[0] == '"' or _space_re.search(value): 837db96d56Sopenharmony_ci value = '{%s}' % value 847db96d56Sopenharmony_ci return value 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_cidef _flatten(seq): 887db96d56Sopenharmony_ci """Internal function.""" 897db96d56Sopenharmony_ci res = () 907db96d56Sopenharmony_ci for item in seq: 917db96d56Sopenharmony_ci if isinstance(item, (tuple, list)): 927db96d56Sopenharmony_ci res = res + _flatten(item) 937db96d56Sopenharmony_ci elif item is not None: 947db96d56Sopenharmony_ci res = res + (item,) 957db96d56Sopenharmony_ci return res 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_citry: _flatten = _tkinter._flatten 997db96d56Sopenharmony_ciexcept AttributeError: pass 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_cidef _cnfmerge(cnfs): 1037db96d56Sopenharmony_ci """Internal function.""" 1047db96d56Sopenharmony_ci if isinstance(cnfs, dict): 1057db96d56Sopenharmony_ci return cnfs 1067db96d56Sopenharmony_ci elif isinstance(cnfs, (type(None), str)): 1077db96d56Sopenharmony_ci return cnfs 1087db96d56Sopenharmony_ci else: 1097db96d56Sopenharmony_ci cnf = {} 1107db96d56Sopenharmony_ci for c in _flatten(cnfs): 1117db96d56Sopenharmony_ci try: 1127db96d56Sopenharmony_ci cnf.update(c) 1137db96d56Sopenharmony_ci except (AttributeError, TypeError) as msg: 1147db96d56Sopenharmony_ci print("_cnfmerge: fallback due to:", msg) 1157db96d56Sopenharmony_ci for k, v in c.items(): 1167db96d56Sopenharmony_ci cnf[k] = v 1177db96d56Sopenharmony_ci return cnf 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_citry: _cnfmerge = _tkinter._cnfmerge 1217db96d56Sopenharmony_ciexcept AttributeError: pass 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_cidef _splitdict(tk, v, cut_minus=True, conv=None): 1257db96d56Sopenharmony_ci """Return a properly formatted dict built from Tcl list pairs. 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci If cut_minus is True, the supposed '-' prefix will be removed from 1287db96d56Sopenharmony_ci keys. If conv is specified, it is used to convert values. 1297db96d56Sopenharmony_ci 1307db96d56Sopenharmony_ci Tcl list is expected to contain an even number of elements. 1317db96d56Sopenharmony_ci """ 1327db96d56Sopenharmony_ci t = tk.splitlist(v) 1337db96d56Sopenharmony_ci if len(t) % 2: 1347db96d56Sopenharmony_ci raise RuntimeError('Tcl list representing a dict is expected ' 1357db96d56Sopenharmony_ci 'to contain an even number of elements') 1367db96d56Sopenharmony_ci it = iter(t) 1377db96d56Sopenharmony_ci dict = {} 1387db96d56Sopenharmony_ci for key, value in zip(it, it): 1397db96d56Sopenharmony_ci key = str(key) 1407db96d56Sopenharmony_ci if cut_minus and key[0] == '-': 1417db96d56Sopenharmony_ci key = key[1:] 1427db96d56Sopenharmony_ci if conv: 1437db96d56Sopenharmony_ci value = conv(value) 1447db96d56Sopenharmony_ci dict[key] = value 1457db96d56Sopenharmony_ci return dict 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ciclass _VersionInfoType(collections.namedtuple('_VersionInfoType', 1487db96d56Sopenharmony_ci ('major', 'minor', 'micro', 'releaselevel', 'serial'))): 1497db96d56Sopenharmony_ci def __str__(self): 1507db96d56Sopenharmony_ci if self.releaselevel == 'final': 1517db96d56Sopenharmony_ci return f'{self.major}.{self.minor}.{self.micro}' 1527db96d56Sopenharmony_ci else: 1537db96d56Sopenharmony_ci return f'{self.major}.{self.minor}{self.releaselevel[0]}{self.serial}' 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_cidef _parse_version(version): 1567db96d56Sopenharmony_ci import re 1577db96d56Sopenharmony_ci m = re.fullmatch(r'(\d+)\.(\d+)([ab.])(\d+)', version) 1587db96d56Sopenharmony_ci major, minor, releaselevel, serial = m.groups() 1597db96d56Sopenharmony_ci major, minor, serial = int(major), int(minor), int(serial) 1607db96d56Sopenharmony_ci if releaselevel == '.': 1617db96d56Sopenharmony_ci micro = serial 1627db96d56Sopenharmony_ci serial = 0 1637db96d56Sopenharmony_ci releaselevel = 'final' 1647db96d56Sopenharmony_ci else: 1657db96d56Sopenharmony_ci micro = 0 1667db96d56Sopenharmony_ci releaselevel = {'a': 'alpha', 'b': 'beta'}[releaselevel] 1677db96d56Sopenharmony_ci return _VersionInfoType(major, minor, micro, releaselevel, serial) 1687db96d56Sopenharmony_ci 1697db96d56Sopenharmony_ci 1707db96d56Sopenharmony_ci@enum._simple_enum(enum.StrEnum) 1717db96d56Sopenharmony_ciclass EventType: 1727db96d56Sopenharmony_ci KeyPress = '2' 1737db96d56Sopenharmony_ci Key = KeyPress 1747db96d56Sopenharmony_ci KeyRelease = '3' 1757db96d56Sopenharmony_ci ButtonPress = '4' 1767db96d56Sopenharmony_ci Button = ButtonPress 1777db96d56Sopenharmony_ci ButtonRelease = '5' 1787db96d56Sopenharmony_ci Motion = '6' 1797db96d56Sopenharmony_ci Enter = '7' 1807db96d56Sopenharmony_ci Leave = '8' 1817db96d56Sopenharmony_ci FocusIn = '9' 1827db96d56Sopenharmony_ci FocusOut = '10' 1837db96d56Sopenharmony_ci Keymap = '11' # undocumented 1847db96d56Sopenharmony_ci Expose = '12' 1857db96d56Sopenharmony_ci GraphicsExpose = '13' # undocumented 1867db96d56Sopenharmony_ci NoExpose = '14' # undocumented 1877db96d56Sopenharmony_ci Visibility = '15' 1887db96d56Sopenharmony_ci Create = '16' 1897db96d56Sopenharmony_ci Destroy = '17' 1907db96d56Sopenharmony_ci Unmap = '18' 1917db96d56Sopenharmony_ci Map = '19' 1927db96d56Sopenharmony_ci MapRequest = '20' 1937db96d56Sopenharmony_ci Reparent = '21' 1947db96d56Sopenharmony_ci Configure = '22' 1957db96d56Sopenharmony_ci ConfigureRequest = '23' 1967db96d56Sopenharmony_ci Gravity = '24' 1977db96d56Sopenharmony_ci ResizeRequest = '25' 1987db96d56Sopenharmony_ci Circulate = '26' 1997db96d56Sopenharmony_ci CirculateRequest = '27' 2007db96d56Sopenharmony_ci Property = '28' 2017db96d56Sopenharmony_ci SelectionClear = '29' # undocumented 2027db96d56Sopenharmony_ci SelectionRequest = '30' # undocumented 2037db96d56Sopenharmony_ci Selection = '31' # undocumented 2047db96d56Sopenharmony_ci Colormap = '32' 2057db96d56Sopenharmony_ci ClientMessage = '33' # undocumented 2067db96d56Sopenharmony_ci Mapping = '34' # undocumented 2077db96d56Sopenharmony_ci VirtualEvent = '35' # undocumented 2087db96d56Sopenharmony_ci Activate = '36' 2097db96d56Sopenharmony_ci Deactivate = '37' 2107db96d56Sopenharmony_ci MouseWheel = '38' 2117db96d56Sopenharmony_ci 2127db96d56Sopenharmony_ci 2137db96d56Sopenharmony_ciclass Event: 2147db96d56Sopenharmony_ci """Container for the properties of an event. 2157db96d56Sopenharmony_ci 2167db96d56Sopenharmony_ci Instances of this type are generated if one of the following events occurs: 2177db96d56Sopenharmony_ci 2187db96d56Sopenharmony_ci KeyPress, KeyRelease - for keyboard events 2197db96d56Sopenharmony_ci ButtonPress, ButtonRelease, Motion, Enter, Leave, MouseWheel - for mouse events 2207db96d56Sopenharmony_ci Visibility, Unmap, Map, Expose, FocusIn, FocusOut, Circulate, 2217db96d56Sopenharmony_ci Colormap, Gravity, Reparent, Property, Destroy, Activate, 2227db96d56Sopenharmony_ci Deactivate - for window events. 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_ci If a callback function for one of these events is registered 2257db96d56Sopenharmony_ci using bind, bind_all, bind_class, or tag_bind, the callback is 2267db96d56Sopenharmony_ci called with an Event as first argument. It will have the 2277db96d56Sopenharmony_ci following attributes (in braces are the event types for which 2287db96d56Sopenharmony_ci the attribute is valid): 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci serial - serial number of event 2317db96d56Sopenharmony_ci num - mouse button pressed (ButtonPress, ButtonRelease) 2327db96d56Sopenharmony_ci focus - whether the window has the focus (Enter, Leave) 2337db96d56Sopenharmony_ci height - height of the exposed window (Configure, Expose) 2347db96d56Sopenharmony_ci width - width of the exposed window (Configure, Expose) 2357db96d56Sopenharmony_ci keycode - keycode of the pressed key (KeyPress, KeyRelease) 2367db96d56Sopenharmony_ci state - state of the event as a number (ButtonPress, ButtonRelease, 2377db96d56Sopenharmony_ci Enter, KeyPress, KeyRelease, 2387db96d56Sopenharmony_ci Leave, Motion) 2397db96d56Sopenharmony_ci state - state as a string (Visibility) 2407db96d56Sopenharmony_ci time - when the event occurred 2417db96d56Sopenharmony_ci x - x-position of the mouse 2427db96d56Sopenharmony_ci y - y-position of the mouse 2437db96d56Sopenharmony_ci x_root - x-position of the mouse on the screen 2447db96d56Sopenharmony_ci (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion) 2457db96d56Sopenharmony_ci y_root - y-position of the mouse on the screen 2467db96d56Sopenharmony_ci (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion) 2477db96d56Sopenharmony_ci char - pressed character (KeyPress, KeyRelease) 2487db96d56Sopenharmony_ci send_event - see X/Windows documentation 2497db96d56Sopenharmony_ci keysym - keysym of the event as a string (KeyPress, KeyRelease) 2507db96d56Sopenharmony_ci keysym_num - keysym of the event as a number (KeyPress, KeyRelease) 2517db96d56Sopenharmony_ci type - type of the event as a number 2527db96d56Sopenharmony_ci widget - widget in which the event occurred 2537db96d56Sopenharmony_ci delta - delta of wheel movement (MouseWheel) 2547db96d56Sopenharmony_ci """ 2557db96d56Sopenharmony_ci 2567db96d56Sopenharmony_ci def __repr__(self): 2577db96d56Sopenharmony_ci attrs = {k: v for k, v in self.__dict__.items() if v != '??'} 2587db96d56Sopenharmony_ci if not self.char: 2597db96d56Sopenharmony_ci del attrs['char'] 2607db96d56Sopenharmony_ci elif self.char != '??': 2617db96d56Sopenharmony_ci attrs['char'] = repr(self.char) 2627db96d56Sopenharmony_ci if not getattr(self, 'send_event', True): 2637db96d56Sopenharmony_ci del attrs['send_event'] 2647db96d56Sopenharmony_ci if self.state == 0: 2657db96d56Sopenharmony_ci del attrs['state'] 2667db96d56Sopenharmony_ci elif isinstance(self.state, int): 2677db96d56Sopenharmony_ci state = self.state 2687db96d56Sopenharmony_ci mods = ('Shift', 'Lock', 'Control', 2697db96d56Sopenharmony_ci 'Mod1', 'Mod2', 'Mod3', 'Mod4', 'Mod5', 2707db96d56Sopenharmony_ci 'Button1', 'Button2', 'Button3', 'Button4', 'Button5') 2717db96d56Sopenharmony_ci s = [] 2727db96d56Sopenharmony_ci for i, n in enumerate(mods): 2737db96d56Sopenharmony_ci if state & (1 << i): 2747db96d56Sopenharmony_ci s.append(n) 2757db96d56Sopenharmony_ci state = state & ~((1<< len(mods)) - 1) 2767db96d56Sopenharmony_ci if state or not s: 2777db96d56Sopenharmony_ci s.append(hex(state)) 2787db96d56Sopenharmony_ci attrs['state'] = '|'.join(s) 2797db96d56Sopenharmony_ci if self.delta == 0: 2807db96d56Sopenharmony_ci del attrs['delta'] 2817db96d56Sopenharmony_ci # widget usually is known 2827db96d56Sopenharmony_ci # serial and time are not very interesting 2837db96d56Sopenharmony_ci # keysym_num duplicates keysym 2847db96d56Sopenharmony_ci # x_root and y_root mostly duplicate x and y 2857db96d56Sopenharmony_ci keys = ('send_event', 2867db96d56Sopenharmony_ci 'state', 'keysym', 'keycode', 'char', 2877db96d56Sopenharmony_ci 'num', 'delta', 'focus', 2887db96d56Sopenharmony_ci 'x', 'y', 'width', 'height') 2897db96d56Sopenharmony_ci return '<%s event%s>' % ( 2907db96d56Sopenharmony_ci getattr(self.type, 'name', self.type), 2917db96d56Sopenharmony_ci ''.join(' %s=%s' % (k, attrs[k]) for k in keys if k in attrs) 2927db96d56Sopenharmony_ci ) 2937db96d56Sopenharmony_ci 2947db96d56Sopenharmony_ci 2957db96d56Sopenharmony_ci_support_default_root = True 2967db96d56Sopenharmony_ci_default_root = None 2977db96d56Sopenharmony_ci 2987db96d56Sopenharmony_ci 2997db96d56Sopenharmony_cidef NoDefaultRoot(): 3007db96d56Sopenharmony_ci """Inhibit setting of default root window. 3017db96d56Sopenharmony_ci 3027db96d56Sopenharmony_ci Call this function to inhibit that the first instance of 3037db96d56Sopenharmony_ci Tk is used for windows without an explicit parent window. 3047db96d56Sopenharmony_ci """ 3057db96d56Sopenharmony_ci global _support_default_root, _default_root 3067db96d56Sopenharmony_ci _support_default_root = False 3077db96d56Sopenharmony_ci # Delete, so any use of _default_root will immediately raise an exception. 3087db96d56Sopenharmony_ci # Rebind before deletion, so repeated calls will not fail. 3097db96d56Sopenharmony_ci _default_root = None 3107db96d56Sopenharmony_ci del _default_root 3117db96d56Sopenharmony_ci 3127db96d56Sopenharmony_ci 3137db96d56Sopenharmony_cidef _get_default_root(what=None): 3147db96d56Sopenharmony_ci if not _support_default_root: 3157db96d56Sopenharmony_ci raise RuntimeError("No master specified and tkinter is " 3167db96d56Sopenharmony_ci "configured to not support default root") 3177db96d56Sopenharmony_ci if _default_root is None: 3187db96d56Sopenharmony_ci if what: 3197db96d56Sopenharmony_ci raise RuntimeError(f"Too early to {what}: no default root window") 3207db96d56Sopenharmony_ci root = Tk() 3217db96d56Sopenharmony_ci assert _default_root is root 3227db96d56Sopenharmony_ci return _default_root 3237db96d56Sopenharmony_ci 3247db96d56Sopenharmony_ci 3257db96d56Sopenharmony_cidef _get_temp_root(): 3267db96d56Sopenharmony_ci global _support_default_root 3277db96d56Sopenharmony_ci if not _support_default_root: 3287db96d56Sopenharmony_ci raise RuntimeError("No master specified and tkinter is " 3297db96d56Sopenharmony_ci "configured to not support default root") 3307db96d56Sopenharmony_ci root = _default_root 3317db96d56Sopenharmony_ci if root is None: 3327db96d56Sopenharmony_ci assert _support_default_root 3337db96d56Sopenharmony_ci _support_default_root = False 3347db96d56Sopenharmony_ci root = Tk() 3357db96d56Sopenharmony_ci _support_default_root = True 3367db96d56Sopenharmony_ci assert _default_root is None 3377db96d56Sopenharmony_ci root.withdraw() 3387db96d56Sopenharmony_ci root._temporary = True 3397db96d56Sopenharmony_ci return root 3407db96d56Sopenharmony_ci 3417db96d56Sopenharmony_ci 3427db96d56Sopenharmony_cidef _destroy_temp_root(master): 3437db96d56Sopenharmony_ci if getattr(master, '_temporary', False): 3447db96d56Sopenharmony_ci try: 3457db96d56Sopenharmony_ci master.destroy() 3467db96d56Sopenharmony_ci except TclError: 3477db96d56Sopenharmony_ci pass 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci 3507db96d56Sopenharmony_cidef _tkerror(err): 3517db96d56Sopenharmony_ci """Internal function.""" 3527db96d56Sopenharmony_ci pass 3537db96d56Sopenharmony_ci 3547db96d56Sopenharmony_ci 3557db96d56Sopenharmony_cidef _exit(code=0): 3567db96d56Sopenharmony_ci """Internal function. Calling it will raise the exception SystemExit.""" 3577db96d56Sopenharmony_ci try: 3587db96d56Sopenharmony_ci code = int(code) 3597db96d56Sopenharmony_ci except ValueError: 3607db96d56Sopenharmony_ci pass 3617db96d56Sopenharmony_ci raise SystemExit(code) 3627db96d56Sopenharmony_ci 3637db96d56Sopenharmony_ci 3647db96d56Sopenharmony_ci_varnum = 0 3657db96d56Sopenharmony_ci 3667db96d56Sopenharmony_ci 3677db96d56Sopenharmony_ciclass Variable: 3687db96d56Sopenharmony_ci """Class to define value holders for e.g. buttons. 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_ci Subclasses StringVar, IntVar, DoubleVar, BooleanVar are specializations 3717db96d56Sopenharmony_ci that constrain the type of the value returned from get().""" 3727db96d56Sopenharmony_ci _default = "" 3737db96d56Sopenharmony_ci _tk = None 3747db96d56Sopenharmony_ci _tclCommands = None 3757db96d56Sopenharmony_ci 3767db96d56Sopenharmony_ci def __init__(self, master=None, value=None, name=None): 3777db96d56Sopenharmony_ci """Construct a variable 3787db96d56Sopenharmony_ci 3797db96d56Sopenharmony_ci MASTER can be given as master widget. 3807db96d56Sopenharmony_ci VALUE is an optional value (defaults to "") 3817db96d56Sopenharmony_ci NAME is an optional Tcl name (defaults to PY_VARnum). 3827db96d56Sopenharmony_ci 3837db96d56Sopenharmony_ci If NAME matches an existing variable and VALUE is omitted 3847db96d56Sopenharmony_ci then the existing value is retained. 3857db96d56Sopenharmony_ci """ 3867db96d56Sopenharmony_ci # check for type of NAME parameter to override weird error message 3877db96d56Sopenharmony_ci # raised from Modules/_tkinter.c:SetVar like: 3887db96d56Sopenharmony_ci # TypeError: setvar() takes exactly 3 arguments (2 given) 3897db96d56Sopenharmony_ci if name is not None and not isinstance(name, str): 3907db96d56Sopenharmony_ci raise TypeError("name must be a string") 3917db96d56Sopenharmony_ci global _varnum 3927db96d56Sopenharmony_ci if master is None: 3937db96d56Sopenharmony_ci master = _get_default_root('create variable') 3947db96d56Sopenharmony_ci self._root = master._root() 3957db96d56Sopenharmony_ci self._tk = master.tk 3967db96d56Sopenharmony_ci if name: 3977db96d56Sopenharmony_ci self._name = name 3987db96d56Sopenharmony_ci else: 3997db96d56Sopenharmony_ci self._name = 'PY_VAR' + repr(_varnum) 4007db96d56Sopenharmony_ci _varnum += 1 4017db96d56Sopenharmony_ci if value is not None: 4027db96d56Sopenharmony_ci self.initialize(value) 4037db96d56Sopenharmony_ci elif not self._tk.getboolean(self._tk.call("info", "exists", self._name)): 4047db96d56Sopenharmony_ci self.initialize(self._default) 4057db96d56Sopenharmony_ci 4067db96d56Sopenharmony_ci def __del__(self): 4077db96d56Sopenharmony_ci """Unset the variable in Tcl.""" 4087db96d56Sopenharmony_ci if self._tk is None: 4097db96d56Sopenharmony_ci return 4107db96d56Sopenharmony_ci if self._tk.getboolean(self._tk.call("info", "exists", self._name)): 4117db96d56Sopenharmony_ci self._tk.globalunsetvar(self._name) 4127db96d56Sopenharmony_ci if self._tclCommands is not None: 4137db96d56Sopenharmony_ci for name in self._tclCommands: 4147db96d56Sopenharmony_ci #print '- Tkinter: deleted command', name 4157db96d56Sopenharmony_ci self._tk.deletecommand(name) 4167db96d56Sopenharmony_ci self._tclCommands = None 4177db96d56Sopenharmony_ci 4187db96d56Sopenharmony_ci def __str__(self): 4197db96d56Sopenharmony_ci """Return the name of the variable in Tcl.""" 4207db96d56Sopenharmony_ci return self._name 4217db96d56Sopenharmony_ci 4227db96d56Sopenharmony_ci def set(self, value): 4237db96d56Sopenharmony_ci """Set the variable to VALUE.""" 4247db96d56Sopenharmony_ci return self._tk.globalsetvar(self._name, value) 4257db96d56Sopenharmony_ci 4267db96d56Sopenharmony_ci initialize = set 4277db96d56Sopenharmony_ci 4287db96d56Sopenharmony_ci def get(self): 4297db96d56Sopenharmony_ci """Return value of variable.""" 4307db96d56Sopenharmony_ci return self._tk.globalgetvar(self._name) 4317db96d56Sopenharmony_ci 4327db96d56Sopenharmony_ci def _register(self, callback): 4337db96d56Sopenharmony_ci f = CallWrapper(callback, None, self._root).__call__ 4347db96d56Sopenharmony_ci cbname = repr(id(f)) 4357db96d56Sopenharmony_ci try: 4367db96d56Sopenharmony_ci callback = callback.__func__ 4377db96d56Sopenharmony_ci except AttributeError: 4387db96d56Sopenharmony_ci pass 4397db96d56Sopenharmony_ci try: 4407db96d56Sopenharmony_ci cbname = cbname + callback.__name__ 4417db96d56Sopenharmony_ci except AttributeError: 4427db96d56Sopenharmony_ci pass 4437db96d56Sopenharmony_ci self._tk.createcommand(cbname, f) 4447db96d56Sopenharmony_ci if self._tclCommands is None: 4457db96d56Sopenharmony_ci self._tclCommands = [] 4467db96d56Sopenharmony_ci self._tclCommands.append(cbname) 4477db96d56Sopenharmony_ci return cbname 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_ci def trace_add(self, mode, callback): 4507db96d56Sopenharmony_ci """Define a trace callback for the variable. 4517db96d56Sopenharmony_ci 4527db96d56Sopenharmony_ci Mode is one of "read", "write", "unset", or a list or tuple of 4537db96d56Sopenharmony_ci such strings. 4547db96d56Sopenharmony_ci Callback must be a function which is called when the variable is 4557db96d56Sopenharmony_ci read, written or unset. 4567db96d56Sopenharmony_ci 4577db96d56Sopenharmony_ci Return the name of the callback. 4587db96d56Sopenharmony_ci """ 4597db96d56Sopenharmony_ci cbname = self._register(callback) 4607db96d56Sopenharmony_ci self._tk.call('trace', 'add', 'variable', 4617db96d56Sopenharmony_ci self._name, mode, (cbname,)) 4627db96d56Sopenharmony_ci return cbname 4637db96d56Sopenharmony_ci 4647db96d56Sopenharmony_ci def trace_remove(self, mode, cbname): 4657db96d56Sopenharmony_ci """Delete the trace callback for a variable. 4667db96d56Sopenharmony_ci 4677db96d56Sopenharmony_ci Mode is one of "read", "write", "unset" or a list or tuple of 4687db96d56Sopenharmony_ci such strings. Must be same as were specified in trace_add(). 4697db96d56Sopenharmony_ci cbname is the name of the callback returned from trace_add(). 4707db96d56Sopenharmony_ci """ 4717db96d56Sopenharmony_ci self._tk.call('trace', 'remove', 'variable', 4727db96d56Sopenharmony_ci self._name, mode, cbname) 4737db96d56Sopenharmony_ci for m, ca in self.trace_info(): 4747db96d56Sopenharmony_ci if self._tk.splitlist(ca)[0] == cbname: 4757db96d56Sopenharmony_ci break 4767db96d56Sopenharmony_ci else: 4777db96d56Sopenharmony_ci self._tk.deletecommand(cbname) 4787db96d56Sopenharmony_ci try: 4797db96d56Sopenharmony_ci self._tclCommands.remove(cbname) 4807db96d56Sopenharmony_ci except ValueError: 4817db96d56Sopenharmony_ci pass 4827db96d56Sopenharmony_ci 4837db96d56Sopenharmony_ci def trace_info(self): 4847db96d56Sopenharmony_ci """Return all trace callback information.""" 4857db96d56Sopenharmony_ci splitlist = self._tk.splitlist 4867db96d56Sopenharmony_ci return [(splitlist(k), v) for k, v in map(splitlist, 4877db96d56Sopenharmony_ci splitlist(self._tk.call('trace', 'info', 'variable', self._name)))] 4887db96d56Sopenharmony_ci 4897db96d56Sopenharmony_ci def trace_variable(self, mode, callback): 4907db96d56Sopenharmony_ci """Define a trace callback for the variable. 4917db96d56Sopenharmony_ci 4927db96d56Sopenharmony_ci MODE is one of "r", "w", "u" for read, write, undefine. 4937db96d56Sopenharmony_ci CALLBACK must be a function which is called when 4947db96d56Sopenharmony_ci the variable is read, written or undefined. 4957db96d56Sopenharmony_ci 4967db96d56Sopenharmony_ci Return the name of the callback. 4977db96d56Sopenharmony_ci 4987db96d56Sopenharmony_ci This deprecated method wraps a deprecated Tcl method that will 4997db96d56Sopenharmony_ci likely be removed in the future. Use trace_add() instead. 5007db96d56Sopenharmony_ci """ 5017db96d56Sopenharmony_ci # TODO: Add deprecation warning 5027db96d56Sopenharmony_ci cbname = self._register(callback) 5037db96d56Sopenharmony_ci self._tk.call("trace", "variable", self._name, mode, cbname) 5047db96d56Sopenharmony_ci return cbname 5057db96d56Sopenharmony_ci 5067db96d56Sopenharmony_ci trace = trace_variable 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ci def trace_vdelete(self, mode, cbname): 5097db96d56Sopenharmony_ci """Delete the trace callback for a variable. 5107db96d56Sopenharmony_ci 5117db96d56Sopenharmony_ci MODE is one of "r", "w", "u" for read, write, undefine. 5127db96d56Sopenharmony_ci CBNAME is the name of the callback returned from trace_variable or trace. 5137db96d56Sopenharmony_ci 5147db96d56Sopenharmony_ci This deprecated method wraps a deprecated Tcl method that will 5157db96d56Sopenharmony_ci likely be removed in the future. Use trace_remove() instead. 5167db96d56Sopenharmony_ci """ 5177db96d56Sopenharmony_ci # TODO: Add deprecation warning 5187db96d56Sopenharmony_ci self._tk.call("trace", "vdelete", self._name, mode, cbname) 5197db96d56Sopenharmony_ci cbname = self._tk.splitlist(cbname)[0] 5207db96d56Sopenharmony_ci for m, ca in self.trace_info(): 5217db96d56Sopenharmony_ci if self._tk.splitlist(ca)[0] == cbname: 5227db96d56Sopenharmony_ci break 5237db96d56Sopenharmony_ci else: 5247db96d56Sopenharmony_ci self._tk.deletecommand(cbname) 5257db96d56Sopenharmony_ci try: 5267db96d56Sopenharmony_ci self._tclCommands.remove(cbname) 5277db96d56Sopenharmony_ci except ValueError: 5287db96d56Sopenharmony_ci pass 5297db96d56Sopenharmony_ci 5307db96d56Sopenharmony_ci def trace_vinfo(self): 5317db96d56Sopenharmony_ci """Return all trace callback information. 5327db96d56Sopenharmony_ci 5337db96d56Sopenharmony_ci This deprecated method wraps a deprecated Tcl method that will 5347db96d56Sopenharmony_ci likely be removed in the future. Use trace_info() instead. 5357db96d56Sopenharmony_ci """ 5367db96d56Sopenharmony_ci # TODO: Add deprecation warning 5377db96d56Sopenharmony_ci return [self._tk.splitlist(x) for x in self._tk.splitlist( 5387db96d56Sopenharmony_ci self._tk.call("trace", "vinfo", self._name))] 5397db96d56Sopenharmony_ci 5407db96d56Sopenharmony_ci def __eq__(self, other): 5417db96d56Sopenharmony_ci if not isinstance(other, Variable): 5427db96d56Sopenharmony_ci return NotImplemented 5437db96d56Sopenharmony_ci return (self._name == other._name 5447db96d56Sopenharmony_ci and self.__class__.__name__ == other.__class__.__name__ 5457db96d56Sopenharmony_ci and self._tk == other._tk) 5467db96d56Sopenharmony_ci 5477db96d56Sopenharmony_ci 5487db96d56Sopenharmony_ciclass StringVar(Variable): 5497db96d56Sopenharmony_ci """Value holder for strings variables.""" 5507db96d56Sopenharmony_ci _default = "" 5517db96d56Sopenharmony_ci 5527db96d56Sopenharmony_ci def __init__(self, master=None, value=None, name=None): 5537db96d56Sopenharmony_ci """Construct a string variable. 5547db96d56Sopenharmony_ci 5557db96d56Sopenharmony_ci MASTER can be given as master widget. 5567db96d56Sopenharmony_ci VALUE is an optional value (defaults to "") 5577db96d56Sopenharmony_ci NAME is an optional Tcl name (defaults to PY_VARnum). 5587db96d56Sopenharmony_ci 5597db96d56Sopenharmony_ci If NAME matches an existing variable and VALUE is omitted 5607db96d56Sopenharmony_ci then the existing value is retained. 5617db96d56Sopenharmony_ci """ 5627db96d56Sopenharmony_ci Variable.__init__(self, master, value, name) 5637db96d56Sopenharmony_ci 5647db96d56Sopenharmony_ci def get(self): 5657db96d56Sopenharmony_ci """Return value of variable as string.""" 5667db96d56Sopenharmony_ci value = self._tk.globalgetvar(self._name) 5677db96d56Sopenharmony_ci if isinstance(value, str): 5687db96d56Sopenharmony_ci return value 5697db96d56Sopenharmony_ci return str(value) 5707db96d56Sopenharmony_ci 5717db96d56Sopenharmony_ci 5727db96d56Sopenharmony_ciclass IntVar(Variable): 5737db96d56Sopenharmony_ci """Value holder for integer variables.""" 5747db96d56Sopenharmony_ci _default = 0 5757db96d56Sopenharmony_ci 5767db96d56Sopenharmony_ci def __init__(self, master=None, value=None, name=None): 5777db96d56Sopenharmony_ci """Construct an integer variable. 5787db96d56Sopenharmony_ci 5797db96d56Sopenharmony_ci MASTER can be given as master widget. 5807db96d56Sopenharmony_ci VALUE is an optional value (defaults to 0) 5817db96d56Sopenharmony_ci NAME is an optional Tcl name (defaults to PY_VARnum). 5827db96d56Sopenharmony_ci 5837db96d56Sopenharmony_ci If NAME matches an existing variable and VALUE is omitted 5847db96d56Sopenharmony_ci then the existing value is retained. 5857db96d56Sopenharmony_ci """ 5867db96d56Sopenharmony_ci Variable.__init__(self, master, value, name) 5877db96d56Sopenharmony_ci 5887db96d56Sopenharmony_ci def get(self): 5897db96d56Sopenharmony_ci """Return the value of the variable as an integer.""" 5907db96d56Sopenharmony_ci value = self._tk.globalgetvar(self._name) 5917db96d56Sopenharmony_ci try: 5927db96d56Sopenharmony_ci return self._tk.getint(value) 5937db96d56Sopenharmony_ci except (TypeError, TclError): 5947db96d56Sopenharmony_ci return int(self._tk.getdouble(value)) 5957db96d56Sopenharmony_ci 5967db96d56Sopenharmony_ci 5977db96d56Sopenharmony_ciclass DoubleVar(Variable): 5987db96d56Sopenharmony_ci """Value holder for float variables.""" 5997db96d56Sopenharmony_ci _default = 0.0 6007db96d56Sopenharmony_ci 6017db96d56Sopenharmony_ci def __init__(self, master=None, value=None, name=None): 6027db96d56Sopenharmony_ci """Construct a float variable. 6037db96d56Sopenharmony_ci 6047db96d56Sopenharmony_ci MASTER can be given as master widget. 6057db96d56Sopenharmony_ci VALUE is an optional value (defaults to 0.0) 6067db96d56Sopenharmony_ci NAME is an optional Tcl name (defaults to PY_VARnum). 6077db96d56Sopenharmony_ci 6087db96d56Sopenharmony_ci If NAME matches an existing variable and VALUE is omitted 6097db96d56Sopenharmony_ci then the existing value is retained. 6107db96d56Sopenharmony_ci """ 6117db96d56Sopenharmony_ci Variable.__init__(self, master, value, name) 6127db96d56Sopenharmony_ci 6137db96d56Sopenharmony_ci def get(self): 6147db96d56Sopenharmony_ci """Return the value of the variable as a float.""" 6157db96d56Sopenharmony_ci return self._tk.getdouble(self._tk.globalgetvar(self._name)) 6167db96d56Sopenharmony_ci 6177db96d56Sopenharmony_ci 6187db96d56Sopenharmony_ciclass BooleanVar(Variable): 6197db96d56Sopenharmony_ci """Value holder for boolean variables.""" 6207db96d56Sopenharmony_ci _default = False 6217db96d56Sopenharmony_ci 6227db96d56Sopenharmony_ci def __init__(self, master=None, value=None, name=None): 6237db96d56Sopenharmony_ci """Construct a boolean variable. 6247db96d56Sopenharmony_ci 6257db96d56Sopenharmony_ci MASTER can be given as master widget. 6267db96d56Sopenharmony_ci VALUE is an optional value (defaults to False) 6277db96d56Sopenharmony_ci NAME is an optional Tcl name (defaults to PY_VARnum). 6287db96d56Sopenharmony_ci 6297db96d56Sopenharmony_ci If NAME matches an existing variable and VALUE is omitted 6307db96d56Sopenharmony_ci then the existing value is retained. 6317db96d56Sopenharmony_ci """ 6327db96d56Sopenharmony_ci Variable.__init__(self, master, value, name) 6337db96d56Sopenharmony_ci 6347db96d56Sopenharmony_ci def set(self, value): 6357db96d56Sopenharmony_ci """Set the variable to VALUE.""" 6367db96d56Sopenharmony_ci return self._tk.globalsetvar(self._name, self._tk.getboolean(value)) 6377db96d56Sopenharmony_ci 6387db96d56Sopenharmony_ci initialize = set 6397db96d56Sopenharmony_ci 6407db96d56Sopenharmony_ci def get(self): 6417db96d56Sopenharmony_ci """Return the value of the variable as a bool.""" 6427db96d56Sopenharmony_ci try: 6437db96d56Sopenharmony_ci return self._tk.getboolean(self._tk.globalgetvar(self._name)) 6447db96d56Sopenharmony_ci except TclError: 6457db96d56Sopenharmony_ci raise ValueError("invalid literal for getboolean()") 6467db96d56Sopenharmony_ci 6477db96d56Sopenharmony_ci 6487db96d56Sopenharmony_cidef mainloop(n=0): 6497db96d56Sopenharmony_ci """Run the main loop of Tcl.""" 6507db96d56Sopenharmony_ci _get_default_root('run the main loop').tk.mainloop(n) 6517db96d56Sopenharmony_ci 6527db96d56Sopenharmony_ci 6537db96d56Sopenharmony_cigetint = int 6547db96d56Sopenharmony_ci 6557db96d56Sopenharmony_cigetdouble = float 6567db96d56Sopenharmony_ci 6577db96d56Sopenharmony_ci 6587db96d56Sopenharmony_cidef getboolean(s): 6597db96d56Sopenharmony_ci """Convert Tcl object to True or False.""" 6607db96d56Sopenharmony_ci try: 6617db96d56Sopenharmony_ci return _get_default_root('use getboolean()').tk.getboolean(s) 6627db96d56Sopenharmony_ci except TclError: 6637db96d56Sopenharmony_ci raise ValueError("invalid literal for getboolean()") 6647db96d56Sopenharmony_ci 6657db96d56Sopenharmony_ci 6667db96d56Sopenharmony_ci# Methods defined on both toplevel and interior widgets 6677db96d56Sopenharmony_ci 6687db96d56Sopenharmony_ciclass Misc: 6697db96d56Sopenharmony_ci """Internal class. 6707db96d56Sopenharmony_ci 6717db96d56Sopenharmony_ci Base class which defines methods common for interior widgets.""" 6727db96d56Sopenharmony_ci 6737db96d56Sopenharmony_ci # used for generating child widget names 6747db96d56Sopenharmony_ci _last_child_ids = None 6757db96d56Sopenharmony_ci 6767db96d56Sopenharmony_ci # XXX font command? 6777db96d56Sopenharmony_ci _tclCommands = None 6787db96d56Sopenharmony_ci 6797db96d56Sopenharmony_ci def destroy(self): 6807db96d56Sopenharmony_ci """Internal function. 6817db96d56Sopenharmony_ci 6827db96d56Sopenharmony_ci Delete all Tcl commands created for 6837db96d56Sopenharmony_ci this widget in the Tcl interpreter.""" 6847db96d56Sopenharmony_ci if self._tclCommands is not None: 6857db96d56Sopenharmony_ci for name in self._tclCommands: 6867db96d56Sopenharmony_ci #print '- Tkinter: deleted command', name 6877db96d56Sopenharmony_ci self.tk.deletecommand(name) 6887db96d56Sopenharmony_ci self._tclCommands = None 6897db96d56Sopenharmony_ci 6907db96d56Sopenharmony_ci def deletecommand(self, name): 6917db96d56Sopenharmony_ci """Internal function. 6927db96d56Sopenharmony_ci 6937db96d56Sopenharmony_ci Delete the Tcl command provided in NAME.""" 6947db96d56Sopenharmony_ci #print '- Tkinter: deleted command', name 6957db96d56Sopenharmony_ci self.tk.deletecommand(name) 6967db96d56Sopenharmony_ci try: 6977db96d56Sopenharmony_ci self._tclCommands.remove(name) 6987db96d56Sopenharmony_ci except ValueError: 6997db96d56Sopenharmony_ci pass 7007db96d56Sopenharmony_ci 7017db96d56Sopenharmony_ci def tk_strictMotif(self, boolean=None): 7027db96d56Sopenharmony_ci """Set Tcl internal variable, whether the look and feel 7037db96d56Sopenharmony_ci should adhere to Motif. 7047db96d56Sopenharmony_ci 7057db96d56Sopenharmony_ci A parameter of 1 means adhere to Motif (e.g. no color 7067db96d56Sopenharmony_ci change if mouse passes over slider). 7077db96d56Sopenharmony_ci Returns the set value.""" 7087db96d56Sopenharmony_ci return self.tk.getboolean(self.tk.call( 7097db96d56Sopenharmony_ci 'set', 'tk_strictMotif', boolean)) 7107db96d56Sopenharmony_ci 7117db96d56Sopenharmony_ci def tk_bisque(self): 7127db96d56Sopenharmony_ci """Change the color scheme to light brown as used in Tk 3.6 and before.""" 7137db96d56Sopenharmony_ci self.tk.call('tk_bisque') 7147db96d56Sopenharmony_ci 7157db96d56Sopenharmony_ci def tk_setPalette(self, *args, **kw): 7167db96d56Sopenharmony_ci """Set a new color scheme for all widget elements. 7177db96d56Sopenharmony_ci 7187db96d56Sopenharmony_ci A single color as argument will cause that all colors of Tk 7197db96d56Sopenharmony_ci widget elements are derived from this. 7207db96d56Sopenharmony_ci Alternatively several keyword parameters and its associated 7217db96d56Sopenharmony_ci colors can be given. The following keywords are valid: 7227db96d56Sopenharmony_ci activeBackground, foreground, selectColor, 7237db96d56Sopenharmony_ci activeForeground, highlightBackground, selectBackground, 7247db96d56Sopenharmony_ci background, highlightColor, selectForeground, 7257db96d56Sopenharmony_ci disabledForeground, insertBackground, troughColor.""" 7267db96d56Sopenharmony_ci self.tk.call(('tk_setPalette',) 7277db96d56Sopenharmony_ci + _flatten(args) + _flatten(list(kw.items()))) 7287db96d56Sopenharmony_ci 7297db96d56Sopenharmony_ci def wait_variable(self, name='PY_VAR'): 7307db96d56Sopenharmony_ci """Wait until the variable is modified. 7317db96d56Sopenharmony_ci 7327db96d56Sopenharmony_ci A parameter of type IntVar, StringVar, DoubleVar or 7337db96d56Sopenharmony_ci BooleanVar must be given.""" 7347db96d56Sopenharmony_ci self.tk.call('tkwait', 'variable', name) 7357db96d56Sopenharmony_ci waitvar = wait_variable # XXX b/w compat 7367db96d56Sopenharmony_ci 7377db96d56Sopenharmony_ci def wait_window(self, window=None): 7387db96d56Sopenharmony_ci """Wait until a WIDGET is destroyed. 7397db96d56Sopenharmony_ci 7407db96d56Sopenharmony_ci If no parameter is given self is used.""" 7417db96d56Sopenharmony_ci if window is None: 7427db96d56Sopenharmony_ci window = self 7437db96d56Sopenharmony_ci self.tk.call('tkwait', 'window', window._w) 7447db96d56Sopenharmony_ci 7457db96d56Sopenharmony_ci def wait_visibility(self, window=None): 7467db96d56Sopenharmony_ci """Wait until the visibility of a WIDGET changes 7477db96d56Sopenharmony_ci (e.g. it appears). 7487db96d56Sopenharmony_ci 7497db96d56Sopenharmony_ci If no parameter is given self is used.""" 7507db96d56Sopenharmony_ci if window is None: 7517db96d56Sopenharmony_ci window = self 7527db96d56Sopenharmony_ci self.tk.call('tkwait', 'visibility', window._w) 7537db96d56Sopenharmony_ci 7547db96d56Sopenharmony_ci def setvar(self, name='PY_VAR', value='1'): 7557db96d56Sopenharmony_ci """Set Tcl variable NAME to VALUE.""" 7567db96d56Sopenharmony_ci self.tk.setvar(name, value) 7577db96d56Sopenharmony_ci 7587db96d56Sopenharmony_ci def getvar(self, name='PY_VAR'): 7597db96d56Sopenharmony_ci """Return value of Tcl variable NAME.""" 7607db96d56Sopenharmony_ci return self.tk.getvar(name) 7617db96d56Sopenharmony_ci 7627db96d56Sopenharmony_ci def getint(self, s): 7637db96d56Sopenharmony_ci try: 7647db96d56Sopenharmony_ci return self.tk.getint(s) 7657db96d56Sopenharmony_ci except TclError as exc: 7667db96d56Sopenharmony_ci raise ValueError(str(exc)) 7677db96d56Sopenharmony_ci 7687db96d56Sopenharmony_ci def getdouble(self, s): 7697db96d56Sopenharmony_ci try: 7707db96d56Sopenharmony_ci return self.tk.getdouble(s) 7717db96d56Sopenharmony_ci except TclError as exc: 7727db96d56Sopenharmony_ci raise ValueError(str(exc)) 7737db96d56Sopenharmony_ci 7747db96d56Sopenharmony_ci def getboolean(self, s): 7757db96d56Sopenharmony_ci """Return a boolean value for Tcl boolean values true and false given as parameter.""" 7767db96d56Sopenharmony_ci try: 7777db96d56Sopenharmony_ci return self.tk.getboolean(s) 7787db96d56Sopenharmony_ci except TclError: 7797db96d56Sopenharmony_ci raise ValueError("invalid literal for getboolean()") 7807db96d56Sopenharmony_ci 7817db96d56Sopenharmony_ci def focus_set(self): 7827db96d56Sopenharmony_ci """Direct input focus to this widget. 7837db96d56Sopenharmony_ci 7847db96d56Sopenharmony_ci If the application currently does not have the focus 7857db96d56Sopenharmony_ci this widget will get the focus if the application gets 7867db96d56Sopenharmony_ci the focus through the window manager.""" 7877db96d56Sopenharmony_ci self.tk.call('focus', self._w) 7887db96d56Sopenharmony_ci focus = focus_set # XXX b/w compat? 7897db96d56Sopenharmony_ci 7907db96d56Sopenharmony_ci def focus_force(self): 7917db96d56Sopenharmony_ci """Direct input focus to this widget even if the 7927db96d56Sopenharmony_ci application does not have the focus. Use with 7937db96d56Sopenharmony_ci caution!""" 7947db96d56Sopenharmony_ci self.tk.call('focus', '-force', self._w) 7957db96d56Sopenharmony_ci 7967db96d56Sopenharmony_ci def focus_get(self): 7977db96d56Sopenharmony_ci """Return the widget which has currently the focus in the 7987db96d56Sopenharmony_ci application. 7997db96d56Sopenharmony_ci 8007db96d56Sopenharmony_ci Use focus_displayof to allow working with several 8017db96d56Sopenharmony_ci displays. Return None if application does not have 8027db96d56Sopenharmony_ci the focus.""" 8037db96d56Sopenharmony_ci name = self.tk.call('focus') 8047db96d56Sopenharmony_ci if name == 'none' or not name: return None 8057db96d56Sopenharmony_ci return self._nametowidget(name) 8067db96d56Sopenharmony_ci 8077db96d56Sopenharmony_ci def focus_displayof(self): 8087db96d56Sopenharmony_ci """Return the widget which has currently the focus on the 8097db96d56Sopenharmony_ci display where this widget is located. 8107db96d56Sopenharmony_ci 8117db96d56Sopenharmony_ci Return None if the application does not have the focus.""" 8127db96d56Sopenharmony_ci name = self.tk.call('focus', '-displayof', self._w) 8137db96d56Sopenharmony_ci if name == 'none' or not name: return None 8147db96d56Sopenharmony_ci return self._nametowidget(name) 8157db96d56Sopenharmony_ci 8167db96d56Sopenharmony_ci def focus_lastfor(self): 8177db96d56Sopenharmony_ci """Return the widget which would have the focus if top level 8187db96d56Sopenharmony_ci for this widget gets the focus from the window manager.""" 8197db96d56Sopenharmony_ci name = self.tk.call('focus', '-lastfor', self._w) 8207db96d56Sopenharmony_ci if name == 'none' or not name: return None 8217db96d56Sopenharmony_ci return self._nametowidget(name) 8227db96d56Sopenharmony_ci 8237db96d56Sopenharmony_ci def tk_focusFollowsMouse(self): 8247db96d56Sopenharmony_ci """The widget under mouse will get automatically focus. Can not 8257db96d56Sopenharmony_ci be disabled easily.""" 8267db96d56Sopenharmony_ci self.tk.call('tk_focusFollowsMouse') 8277db96d56Sopenharmony_ci 8287db96d56Sopenharmony_ci def tk_focusNext(self): 8297db96d56Sopenharmony_ci """Return the next widget in the focus order which follows 8307db96d56Sopenharmony_ci widget which has currently the focus. 8317db96d56Sopenharmony_ci 8327db96d56Sopenharmony_ci The focus order first goes to the next child, then to 8337db96d56Sopenharmony_ci the children of the child recursively and then to the 8347db96d56Sopenharmony_ci next sibling which is higher in the stacking order. A 8357db96d56Sopenharmony_ci widget is omitted if it has the takefocus resource set 8367db96d56Sopenharmony_ci to 0.""" 8377db96d56Sopenharmony_ci name = self.tk.call('tk_focusNext', self._w) 8387db96d56Sopenharmony_ci if not name: return None 8397db96d56Sopenharmony_ci return self._nametowidget(name) 8407db96d56Sopenharmony_ci 8417db96d56Sopenharmony_ci def tk_focusPrev(self): 8427db96d56Sopenharmony_ci """Return previous widget in the focus order. See tk_focusNext for details.""" 8437db96d56Sopenharmony_ci name = self.tk.call('tk_focusPrev', self._w) 8447db96d56Sopenharmony_ci if not name: return None 8457db96d56Sopenharmony_ci return self._nametowidget(name) 8467db96d56Sopenharmony_ci 8477db96d56Sopenharmony_ci def after(self, ms, func=None, *args): 8487db96d56Sopenharmony_ci """Call function once after given time. 8497db96d56Sopenharmony_ci 8507db96d56Sopenharmony_ci MS specifies the time in milliseconds. FUNC gives the 8517db96d56Sopenharmony_ci function which shall be called. Additional parameters 8527db96d56Sopenharmony_ci are given as parameters to the function call. Return 8537db96d56Sopenharmony_ci identifier to cancel scheduling with after_cancel.""" 8547db96d56Sopenharmony_ci if func is None: 8557db96d56Sopenharmony_ci # I'd rather use time.sleep(ms*0.001) 8567db96d56Sopenharmony_ci self.tk.call('after', ms) 8577db96d56Sopenharmony_ci return None 8587db96d56Sopenharmony_ci else: 8597db96d56Sopenharmony_ci def callit(): 8607db96d56Sopenharmony_ci try: 8617db96d56Sopenharmony_ci func(*args) 8627db96d56Sopenharmony_ci finally: 8637db96d56Sopenharmony_ci try: 8647db96d56Sopenharmony_ci self.deletecommand(name) 8657db96d56Sopenharmony_ci except TclError: 8667db96d56Sopenharmony_ci pass 8677db96d56Sopenharmony_ci try: 8687db96d56Sopenharmony_ci callit.__name__ = func.__name__ 8697db96d56Sopenharmony_ci except AttributeError: 8707db96d56Sopenharmony_ci # Required for callable classes (bpo-44404) 8717db96d56Sopenharmony_ci callit.__name__ = type(func).__name__ 8727db96d56Sopenharmony_ci name = self._register(callit) 8737db96d56Sopenharmony_ci return self.tk.call('after', ms, name) 8747db96d56Sopenharmony_ci 8757db96d56Sopenharmony_ci def after_idle(self, func, *args): 8767db96d56Sopenharmony_ci """Call FUNC once if the Tcl main loop has no event to 8777db96d56Sopenharmony_ci process. 8787db96d56Sopenharmony_ci 8797db96d56Sopenharmony_ci Return an identifier to cancel the scheduling with 8807db96d56Sopenharmony_ci after_cancel.""" 8817db96d56Sopenharmony_ci return self.after('idle', func, *args) 8827db96d56Sopenharmony_ci 8837db96d56Sopenharmony_ci def after_cancel(self, id): 8847db96d56Sopenharmony_ci """Cancel scheduling of function identified with ID. 8857db96d56Sopenharmony_ci 8867db96d56Sopenharmony_ci Identifier returned by after or after_idle must be 8877db96d56Sopenharmony_ci given as first parameter. 8887db96d56Sopenharmony_ci """ 8897db96d56Sopenharmony_ci if not id: 8907db96d56Sopenharmony_ci raise ValueError('id must be a valid identifier returned from ' 8917db96d56Sopenharmony_ci 'after or after_idle') 8927db96d56Sopenharmony_ci try: 8937db96d56Sopenharmony_ci data = self.tk.call('after', 'info', id) 8947db96d56Sopenharmony_ci script = self.tk.splitlist(data)[0] 8957db96d56Sopenharmony_ci self.deletecommand(script) 8967db96d56Sopenharmony_ci except TclError: 8977db96d56Sopenharmony_ci pass 8987db96d56Sopenharmony_ci self.tk.call('after', 'cancel', id) 8997db96d56Sopenharmony_ci 9007db96d56Sopenharmony_ci def bell(self, displayof=0): 9017db96d56Sopenharmony_ci """Ring a display's bell.""" 9027db96d56Sopenharmony_ci self.tk.call(('bell',) + self._displayof(displayof)) 9037db96d56Sopenharmony_ci 9047db96d56Sopenharmony_ci # Clipboard handling: 9057db96d56Sopenharmony_ci def clipboard_get(self, **kw): 9067db96d56Sopenharmony_ci """Retrieve data from the clipboard on window's display. 9077db96d56Sopenharmony_ci 9087db96d56Sopenharmony_ci The window keyword defaults to the root window of the Tkinter 9097db96d56Sopenharmony_ci application. 9107db96d56Sopenharmony_ci 9117db96d56Sopenharmony_ci The type keyword specifies the form in which the data is 9127db96d56Sopenharmony_ci to be returned and should be an atom name such as STRING 9137db96d56Sopenharmony_ci or FILE_NAME. Type defaults to STRING, except on X11, where the default 9147db96d56Sopenharmony_ci is to try UTF8_STRING and fall back to STRING. 9157db96d56Sopenharmony_ci 9167db96d56Sopenharmony_ci This command is equivalent to: 9177db96d56Sopenharmony_ci 9187db96d56Sopenharmony_ci selection_get(CLIPBOARD) 9197db96d56Sopenharmony_ci """ 9207db96d56Sopenharmony_ci if 'type' not in kw and self._windowingsystem == 'x11': 9217db96d56Sopenharmony_ci try: 9227db96d56Sopenharmony_ci kw['type'] = 'UTF8_STRING' 9237db96d56Sopenharmony_ci return self.tk.call(('clipboard', 'get') + self._options(kw)) 9247db96d56Sopenharmony_ci except TclError: 9257db96d56Sopenharmony_ci del kw['type'] 9267db96d56Sopenharmony_ci return self.tk.call(('clipboard', 'get') + self._options(kw)) 9277db96d56Sopenharmony_ci 9287db96d56Sopenharmony_ci def clipboard_clear(self, **kw): 9297db96d56Sopenharmony_ci """Clear the data in the Tk clipboard. 9307db96d56Sopenharmony_ci 9317db96d56Sopenharmony_ci A widget specified for the optional displayof keyword 9327db96d56Sopenharmony_ci argument specifies the target display.""" 9337db96d56Sopenharmony_ci if 'displayof' not in kw: kw['displayof'] = self._w 9347db96d56Sopenharmony_ci self.tk.call(('clipboard', 'clear') + self._options(kw)) 9357db96d56Sopenharmony_ci 9367db96d56Sopenharmony_ci def clipboard_append(self, string, **kw): 9377db96d56Sopenharmony_ci """Append STRING to the Tk clipboard. 9387db96d56Sopenharmony_ci 9397db96d56Sopenharmony_ci A widget specified at the optional displayof keyword 9407db96d56Sopenharmony_ci argument specifies the target display. The clipboard 9417db96d56Sopenharmony_ci can be retrieved with selection_get.""" 9427db96d56Sopenharmony_ci if 'displayof' not in kw: kw['displayof'] = self._w 9437db96d56Sopenharmony_ci self.tk.call(('clipboard', 'append') + self._options(kw) 9447db96d56Sopenharmony_ci + ('--', string)) 9457db96d56Sopenharmony_ci # XXX grab current w/o window argument 9467db96d56Sopenharmony_ci 9477db96d56Sopenharmony_ci def grab_current(self): 9487db96d56Sopenharmony_ci """Return widget which has currently the grab in this application 9497db96d56Sopenharmony_ci or None.""" 9507db96d56Sopenharmony_ci name = self.tk.call('grab', 'current', self._w) 9517db96d56Sopenharmony_ci if not name: return None 9527db96d56Sopenharmony_ci return self._nametowidget(name) 9537db96d56Sopenharmony_ci 9547db96d56Sopenharmony_ci def grab_release(self): 9557db96d56Sopenharmony_ci """Release grab for this widget if currently set.""" 9567db96d56Sopenharmony_ci self.tk.call('grab', 'release', self._w) 9577db96d56Sopenharmony_ci 9587db96d56Sopenharmony_ci def grab_set(self): 9597db96d56Sopenharmony_ci """Set grab for this widget. 9607db96d56Sopenharmony_ci 9617db96d56Sopenharmony_ci A grab directs all events to this and descendant 9627db96d56Sopenharmony_ci widgets in the application.""" 9637db96d56Sopenharmony_ci self.tk.call('grab', 'set', self._w) 9647db96d56Sopenharmony_ci 9657db96d56Sopenharmony_ci def grab_set_global(self): 9667db96d56Sopenharmony_ci """Set global grab for this widget. 9677db96d56Sopenharmony_ci 9687db96d56Sopenharmony_ci A global grab directs all events to this and 9697db96d56Sopenharmony_ci descendant widgets on the display. Use with caution - 9707db96d56Sopenharmony_ci other applications do not get events anymore.""" 9717db96d56Sopenharmony_ci self.tk.call('grab', 'set', '-global', self._w) 9727db96d56Sopenharmony_ci 9737db96d56Sopenharmony_ci def grab_status(self): 9747db96d56Sopenharmony_ci """Return None, "local" or "global" if this widget has 9757db96d56Sopenharmony_ci no, a local or a global grab.""" 9767db96d56Sopenharmony_ci status = self.tk.call('grab', 'status', self._w) 9777db96d56Sopenharmony_ci if status == 'none': status = None 9787db96d56Sopenharmony_ci return status 9797db96d56Sopenharmony_ci 9807db96d56Sopenharmony_ci def option_add(self, pattern, value, priority = None): 9817db96d56Sopenharmony_ci """Set a VALUE (second parameter) for an option 9827db96d56Sopenharmony_ci PATTERN (first parameter). 9837db96d56Sopenharmony_ci 9847db96d56Sopenharmony_ci An optional third parameter gives the numeric priority 9857db96d56Sopenharmony_ci (defaults to 80).""" 9867db96d56Sopenharmony_ci self.tk.call('option', 'add', pattern, value, priority) 9877db96d56Sopenharmony_ci 9887db96d56Sopenharmony_ci def option_clear(self): 9897db96d56Sopenharmony_ci """Clear the option database. 9907db96d56Sopenharmony_ci 9917db96d56Sopenharmony_ci It will be reloaded if option_add is called.""" 9927db96d56Sopenharmony_ci self.tk.call('option', 'clear') 9937db96d56Sopenharmony_ci 9947db96d56Sopenharmony_ci def option_get(self, name, className): 9957db96d56Sopenharmony_ci """Return the value for an option NAME for this widget 9967db96d56Sopenharmony_ci with CLASSNAME. 9977db96d56Sopenharmony_ci 9987db96d56Sopenharmony_ci Values with higher priority override lower values.""" 9997db96d56Sopenharmony_ci return self.tk.call('option', 'get', self._w, name, className) 10007db96d56Sopenharmony_ci 10017db96d56Sopenharmony_ci def option_readfile(self, fileName, priority = None): 10027db96d56Sopenharmony_ci """Read file FILENAME into the option database. 10037db96d56Sopenharmony_ci 10047db96d56Sopenharmony_ci An optional second parameter gives the numeric 10057db96d56Sopenharmony_ci priority.""" 10067db96d56Sopenharmony_ci self.tk.call('option', 'readfile', fileName, priority) 10077db96d56Sopenharmony_ci 10087db96d56Sopenharmony_ci def selection_clear(self, **kw): 10097db96d56Sopenharmony_ci """Clear the current X selection.""" 10107db96d56Sopenharmony_ci if 'displayof' not in kw: kw['displayof'] = self._w 10117db96d56Sopenharmony_ci self.tk.call(('selection', 'clear') + self._options(kw)) 10127db96d56Sopenharmony_ci 10137db96d56Sopenharmony_ci def selection_get(self, **kw): 10147db96d56Sopenharmony_ci """Return the contents of the current X selection. 10157db96d56Sopenharmony_ci 10167db96d56Sopenharmony_ci A keyword parameter selection specifies the name of 10177db96d56Sopenharmony_ci the selection and defaults to PRIMARY. A keyword 10187db96d56Sopenharmony_ci parameter displayof specifies a widget on the display 10197db96d56Sopenharmony_ci to use. A keyword parameter type specifies the form of data to be 10207db96d56Sopenharmony_ci fetched, defaulting to STRING except on X11, where UTF8_STRING is tried 10217db96d56Sopenharmony_ci before STRING.""" 10227db96d56Sopenharmony_ci if 'displayof' not in kw: kw['displayof'] = self._w 10237db96d56Sopenharmony_ci if 'type' not in kw and self._windowingsystem == 'x11': 10247db96d56Sopenharmony_ci try: 10257db96d56Sopenharmony_ci kw['type'] = 'UTF8_STRING' 10267db96d56Sopenharmony_ci return self.tk.call(('selection', 'get') + self._options(kw)) 10277db96d56Sopenharmony_ci except TclError: 10287db96d56Sopenharmony_ci del kw['type'] 10297db96d56Sopenharmony_ci return self.tk.call(('selection', 'get') + self._options(kw)) 10307db96d56Sopenharmony_ci 10317db96d56Sopenharmony_ci def selection_handle(self, command, **kw): 10327db96d56Sopenharmony_ci """Specify a function COMMAND to call if the X 10337db96d56Sopenharmony_ci selection owned by this widget is queried by another 10347db96d56Sopenharmony_ci application. 10357db96d56Sopenharmony_ci 10367db96d56Sopenharmony_ci This function must return the contents of the 10377db96d56Sopenharmony_ci selection. The function will be called with the 10387db96d56Sopenharmony_ci arguments OFFSET and LENGTH which allows the chunking 10397db96d56Sopenharmony_ci of very long selections. The following keyword 10407db96d56Sopenharmony_ci parameters can be provided: 10417db96d56Sopenharmony_ci selection - name of the selection (default PRIMARY), 10427db96d56Sopenharmony_ci type - type of the selection (e.g. STRING, FILE_NAME).""" 10437db96d56Sopenharmony_ci name = self._register(command) 10447db96d56Sopenharmony_ci self.tk.call(('selection', 'handle') + self._options(kw) 10457db96d56Sopenharmony_ci + (self._w, name)) 10467db96d56Sopenharmony_ci 10477db96d56Sopenharmony_ci def selection_own(self, **kw): 10487db96d56Sopenharmony_ci """Become owner of X selection. 10497db96d56Sopenharmony_ci 10507db96d56Sopenharmony_ci A keyword parameter selection specifies the name of 10517db96d56Sopenharmony_ci the selection (default PRIMARY).""" 10527db96d56Sopenharmony_ci self.tk.call(('selection', 'own') + 10537db96d56Sopenharmony_ci self._options(kw) + (self._w,)) 10547db96d56Sopenharmony_ci 10557db96d56Sopenharmony_ci def selection_own_get(self, **kw): 10567db96d56Sopenharmony_ci """Return owner of X selection. 10577db96d56Sopenharmony_ci 10587db96d56Sopenharmony_ci The following keyword parameter can 10597db96d56Sopenharmony_ci be provided: 10607db96d56Sopenharmony_ci selection - name of the selection (default PRIMARY), 10617db96d56Sopenharmony_ci type - type of the selection (e.g. STRING, FILE_NAME).""" 10627db96d56Sopenharmony_ci if 'displayof' not in kw: kw['displayof'] = self._w 10637db96d56Sopenharmony_ci name = self.tk.call(('selection', 'own') + self._options(kw)) 10647db96d56Sopenharmony_ci if not name: return None 10657db96d56Sopenharmony_ci return self._nametowidget(name) 10667db96d56Sopenharmony_ci 10677db96d56Sopenharmony_ci def send(self, interp, cmd, *args): 10687db96d56Sopenharmony_ci """Send Tcl command CMD to different interpreter INTERP to be executed.""" 10697db96d56Sopenharmony_ci return self.tk.call(('send', interp, cmd) + args) 10707db96d56Sopenharmony_ci 10717db96d56Sopenharmony_ci def lower(self, belowThis=None): 10727db96d56Sopenharmony_ci """Lower this widget in the stacking order.""" 10737db96d56Sopenharmony_ci self.tk.call('lower', self._w, belowThis) 10747db96d56Sopenharmony_ci 10757db96d56Sopenharmony_ci def tkraise(self, aboveThis=None): 10767db96d56Sopenharmony_ci """Raise this widget in the stacking order.""" 10777db96d56Sopenharmony_ci self.tk.call('raise', self._w, aboveThis) 10787db96d56Sopenharmony_ci 10797db96d56Sopenharmony_ci lift = tkraise 10807db96d56Sopenharmony_ci 10817db96d56Sopenharmony_ci def info_patchlevel(self): 10827db96d56Sopenharmony_ci """Returns the exact version of the Tcl library.""" 10837db96d56Sopenharmony_ci patchlevel = self.tk.call('info', 'patchlevel') 10847db96d56Sopenharmony_ci return _parse_version(patchlevel) 10857db96d56Sopenharmony_ci 10867db96d56Sopenharmony_ci def winfo_atom(self, name, displayof=0): 10877db96d56Sopenharmony_ci """Return integer which represents atom NAME.""" 10887db96d56Sopenharmony_ci args = ('winfo', 'atom') + self._displayof(displayof) + (name,) 10897db96d56Sopenharmony_ci return self.tk.getint(self.tk.call(args)) 10907db96d56Sopenharmony_ci 10917db96d56Sopenharmony_ci def winfo_atomname(self, id, displayof=0): 10927db96d56Sopenharmony_ci """Return name of atom with identifier ID.""" 10937db96d56Sopenharmony_ci args = ('winfo', 'atomname') \ 10947db96d56Sopenharmony_ci + self._displayof(displayof) + (id,) 10957db96d56Sopenharmony_ci return self.tk.call(args) 10967db96d56Sopenharmony_ci 10977db96d56Sopenharmony_ci def winfo_cells(self): 10987db96d56Sopenharmony_ci """Return number of cells in the colormap for this widget.""" 10997db96d56Sopenharmony_ci return self.tk.getint( 11007db96d56Sopenharmony_ci self.tk.call('winfo', 'cells', self._w)) 11017db96d56Sopenharmony_ci 11027db96d56Sopenharmony_ci def winfo_children(self): 11037db96d56Sopenharmony_ci """Return a list of all widgets which are children of this widget.""" 11047db96d56Sopenharmony_ci result = [] 11057db96d56Sopenharmony_ci for child in self.tk.splitlist( 11067db96d56Sopenharmony_ci self.tk.call('winfo', 'children', self._w)): 11077db96d56Sopenharmony_ci try: 11087db96d56Sopenharmony_ci # Tcl sometimes returns extra windows, e.g. for 11097db96d56Sopenharmony_ci # menus; those need to be skipped 11107db96d56Sopenharmony_ci result.append(self._nametowidget(child)) 11117db96d56Sopenharmony_ci except KeyError: 11127db96d56Sopenharmony_ci pass 11137db96d56Sopenharmony_ci return result 11147db96d56Sopenharmony_ci 11157db96d56Sopenharmony_ci def winfo_class(self): 11167db96d56Sopenharmony_ci """Return window class name of this widget.""" 11177db96d56Sopenharmony_ci return self.tk.call('winfo', 'class', self._w) 11187db96d56Sopenharmony_ci 11197db96d56Sopenharmony_ci def winfo_colormapfull(self): 11207db96d56Sopenharmony_ci """Return True if at the last color request the colormap was full.""" 11217db96d56Sopenharmony_ci return self.tk.getboolean( 11227db96d56Sopenharmony_ci self.tk.call('winfo', 'colormapfull', self._w)) 11237db96d56Sopenharmony_ci 11247db96d56Sopenharmony_ci def winfo_containing(self, rootX, rootY, displayof=0): 11257db96d56Sopenharmony_ci """Return the widget which is at the root coordinates ROOTX, ROOTY.""" 11267db96d56Sopenharmony_ci args = ('winfo', 'containing') \ 11277db96d56Sopenharmony_ci + self._displayof(displayof) + (rootX, rootY) 11287db96d56Sopenharmony_ci name = self.tk.call(args) 11297db96d56Sopenharmony_ci if not name: return None 11307db96d56Sopenharmony_ci return self._nametowidget(name) 11317db96d56Sopenharmony_ci 11327db96d56Sopenharmony_ci def winfo_depth(self): 11337db96d56Sopenharmony_ci """Return the number of bits per pixel.""" 11347db96d56Sopenharmony_ci return self.tk.getint(self.tk.call('winfo', 'depth', self._w)) 11357db96d56Sopenharmony_ci 11367db96d56Sopenharmony_ci def winfo_exists(self): 11377db96d56Sopenharmony_ci """Return true if this widget exists.""" 11387db96d56Sopenharmony_ci return self.tk.getint( 11397db96d56Sopenharmony_ci self.tk.call('winfo', 'exists', self._w)) 11407db96d56Sopenharmony_ci 11417db96d56Sopenharmony_ci def winfo_fpixels(self, number): 11427db96d56Sopenharmony_ci """Return the number of pixels for the given distance NUMBER 11437db96d56Sopenharmony_ci (e.g. "3c") as float.""" 11447db96d56Sopenharmony_ci return self.tk.getdouble(self.tk.call( 11457db96d56Sopenharmony_ci 'winfo', 'fpixels', self._w, number)) 11467db96d56Sopenharmony_ci 11477db96d56Sopenharmony_ci def winfo_geometry(self): 11487db96d56Sopenharmony_ci """Return geometry string for this widget in the form "widthxheight+X+Y".""" 11497db96d56Sopenharmony_ci return self.tk.call('winfo', 'geometry', self._w) 11507db96d56Sopenharmony_ci 11517db96d56Sopenharmony_ci def winfo_height(self): 11527db96d56Sopenharmony_ci """Return height of this widget.""" 11537db96d56Sopenharmony_ci return self.tk.getint( 11547db96d56Sopenharmony_ci self.tk.call('winfo', 'height', self._w)) 11557db96d56Sopenharmony_ci 11567db96d56Sopenharmony_ci def winfo_id(self): 11577db96d56Sopenharmony_ci """Return identifier ID for this widget.""" 11587db96d56Sopenharmony_ci return int(self.tk.call('winfo', 'id', self._w), 0) 11597db96d56Sopenharmony_ci 11607db96d56Sopenharmony_ci def winfo_interps(self, displayof=0): 11617db96d56Sopenharmony_ci """Return the name of all Tcl interpreters for this display.""" 11627db96d56Sopenharmony_ci args = ('winfo', 'interps') + self._displayof(displayof) 11637db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call(args)) 11647db96d56Sopenharmony_ci 11657db96d56Sopenharmony_ci def winfo_ismapped(self): 11667db96d56Sopenharmony_ci """Return true if this widget is mapped.""" 11677db96d56Sopenharmony_ci return self.tk.getint( 11687db96d56Sopenharmony_ci self.tk.call('winfo', 'ismapped', self._w)) 11697db96d56Sopenharmony_ci 11707db96d56Sopenharmony_ci def winfo_manager(self): 11717db96d56Sopenharmony_ci """Return the window manager name for this widget.""" 11727db96d56Sopenharmony_ci return self.tk.call('winfo', 'manager', self._w) 11737db96d56Sopenharmony_ci 11747db96d56Sopenharmony_ci def winfo_name(self): 11757db96d56Sopenharmony_ci """Return the name of this widget.""" 11767db96d56Sopenharmony_ci return self.tk.call('winfo', 'name', self._w) 11777db96d56Sopenharmony_ci 11787db96d56Sopenharmony_ci def winfo_parent(self): 11797db96d56Sopenharmony_ci """Return the name of the parent of this widget.""" 11807db96d56Sopenharmony_ci return self.tk.call('winfo', 'parent', self._w) 11817db96d56Sopenharmony_ci 11827db96d56Sopenharmony_ci def winfo_pathname(self, id, displayof=0): 11837db96d56Sopenharmony_ci """Return the pathname of the widget given by ID.""" 11847db96d56Sopenharmony_ci args = ('winfo', 'pathname') \ 11857db96d56Sopenharmony_ci + self._displayof(displayof) + (id,) 11867db96d56Sopenharmony_ci return self.tk.call(args) 11877db96d56Sopenharmony_ci 11887db96d56Sopenharmony_ci def winfo_pixels(self, number): 11897db96d56Sopenharmony_ci """Rounded integer value of winfo_fpixels.""" 11907db96d56Sopenharmony_ci return self.tk.getint( 11917db96d56Sopenharmony_ci self.tk.call('winfo', 'pixels', self._w, number)) 11927db96d56Sopenharmony_ci 11937db96d56Sopenharmony_ci def winfo_pointerx(self): 11947db96d56Sopenharmony_ci """Return the x coordinate of the pointer on the root window.""" 11957db96d56Sopenharmony_ci return self.tk.getint( 11967db96d56Sopenharmony_ci self.tk.call('winfo', 'pointerx', self._w)) 11977db96d56Sopenharmony_ci 11987db96d56Sopenharmony_ci def winfo_pointerxy(self): 11997db96d56Sopenharmony_ci """Return a tuple of x and y coordinates of the pointer on the root window.""" 12007db96d56Sopenharmony_ci return self._getints( 12017db96d56Sopenharmony_ci self.tk.call('winfo', 'pointerxy', self._w)) 12027db96d56Sopenharmony_ci 12037db96d56Sopenharmony_ci def winfo_pointery(self): 12047db96d56Sopenharmony_ci """Return the y coordinate of the pointer on the root window.""" 12057db96d56Sopenharmony_ci return self.tk.getint( 12067db96d56Sopenharmony_ci self.tk.call('winfo', 'pointery', self._w)) 12077db96d56Sopenharmony_ci 12087db96d56Sopenharmony_ci def winfo_reqheight(self): 12097db96d56Sopenharmony_ci """Return requested height of this widget.""" 12107db96d56Sopenharmony_ci return self.tk.getint( 12117db96d56Sopenharmony_ci self.tk.call('winfo', 'reqheight', self._w)) 12127db96d56Sopenharmony_ci 12137db96d56Sopenharmony_ci def winfo_reqwidth(self): 12147db96d56Sopenharmony_ci """Return requested width of this widget.""" 12157db96d56Sopenharmony_ci return self.tk.getint( 12167db96d56Sopenharmony_ci self.tk.call('winfo', 'reqwidth', self._w)) 12177db96d56Sopenharmony_ci 12187db96d56Sopenharmony_ci def winfo_rgb(self, color): 12197db96d56Sopenharmony_ci """Return a tuple of integer RGB values in range(65536) for color in this widget.""" 12207db96d56Sopenharmony_ci return self._getints( 12217db96d56Sopenharmony_ci self.tk.call('winfo', 'rgb', self._w, color)) 12227db96d56Sopenharmony_ci 12237db96d56Sopenharmony_ci def winfo_rootx(self): 12247db96d56Sopenharmony_ci """Return x coordinate of upper left corner of this widget on the 12257db96d56Sopenharmony_ci root window.""" 12267db96d56Sopenharmony_ci return self.tk.getint( 12277db96d56Sopenharmony_ci self.tk.call('winfo', 'rootx', self._w)) 12287db96d56Sopenharmony_ci 12297db96d56Sopenharmony_ci def winfo_rooty(self): 12307db96d56Sopenharmony_ci """Return y coordinate of upper left corner of this widget on the 12317db96d56Sopenharmony_ci root window.""" 12327db96d56Sopenharmony_ci return self.tk.getint( 12337db96d56Sopenharmony_ci self.tk.call('winfo', 'rooty', self._w)) 12347db96d56Sopenharmony_ci 12357db96d56Sopenharmony_ci def winfo_screen(self): 12367db96d56Sopenharmony_ci """Return the screen name of this widget.""" 12377db96d56Sopenharmony_ci return self.tk.call('winfo', 'screen', self._w) 12387db96d56Sopenharmony_ci 12397db96d56Sopenharmony_ci def winfo_screencells(self): 12407db96d56Sopenharmony_ci """Return the number of the cells in the colormap of the screen 12417db96d56Sopenharmony_ci of this widget.""" 12427db96d56Sopenharmony_ci return self.tk.getint( 12437db96d56Sopenharmony_ci self.tk.call('winfo', 'screencells', self._w)) 12447db96d56Sopenharmony_ci 12457db96d56Sopenharmony_ci def winfo_screendepth(self): 12467db96d56Sopenharmony_ci """Return the number of bits per pixel of the root window of the 12477db96d56Sopenharmony_ci screen of this widget.""" 12487db96d56Sopenharmony_ci return self.tk.getint( 12497db96d56Sopenharmony_ci self.tk.call('winfo', 'screendepth', self._w)) 12507db96d56Sopenharmony_ci 12517db96d56Sopenharmony_ci def winfo_screenheight(self): 12527db96d56Sopenharmony_ci """Return the number of pixels of the height of the screen of this widget 12537db96d56Sopenharmony_ci in pixel.""" 12547db96d56Sopenharmony_ci return self.tk.getint( 12557db96d56Sopenharmony_ci self.tk.call('winfo', 'screenheight', self._w)) 12567db96d56Sopenharmony_ci 12577db96d56Sopenharmony_ci def winfo_screenmmheight(self): 12587db96d56Sopenharmony_ci """Return the number of pixels of the height of the screen of 12597db96d56Sopenharmony_ci this widget in mm.""" 12607db96d56Sopenharmony_ci return self.tk.getint( 12617db96d56Sopenharmony_ci self.tk.call('winfo', 'screenmmheight', self._w)) 12627db96d56Sopenharmony_ci 12637db96d56Sopenharmony_ci def winfo_screenmmwidth(self): 12647db96d56Sopenharmony_ci """Return the number of pixels of the width of the screen of 12657db96d56Sopenharmony_ci this widget in mm.""" 12667db96d56Sopenharmony_ci return self.tk.getint( 12677db96d56Sopenharmony_ci self.tk.call('winfo', 'screenmmwidth', self._w)) 12687db96d56Sopenharmony_ci 12697db96d56Sopenharmony_ci def winfo_screenvisual(self): 12707db96d56Sopenharmony_ci """Return one of the strings directcolor, grayscale, pseudocolor, 12717db96d56Sopenharmony_ci staticcolor, staticgray, or truecolor for the default 12727db96d56Sopenharmony_ci colormodel of this screen.""" 12737db96d56Sopenharmony_ci return self.tk.call('winfo', 'screenvisual', self._w) 12747db96d56Sopenharmony_ci 12757db96d56Sopenharmony_ci def winfo_screenwidth(self): 12767db96d56Sopenharmony_ci """Return the number of pixels of the width of the screen of 12777db96d56Sopenharmony_ci this widget in pixel.""" 12787db96d56Sopenharmony_ci return self.tk.getint( 12797db96d56Sopenharmony_ci self.tk.call('winfo', 'screenwidth', self._w)) 12807db96d56Sopenharmony_ci 12817db96d56Sopenharmony_ci def winfo_server(self): 12827db96d56Sopenharmony_ci """Return information of the X-Server of the screen of this widget in 12837db96d56Sopenharmony_ci the form "XmajorRminor vendor vendorVersion".""" 12847db96d56Sopenharmony_ci return self.tk.call('winfo', 'server', self._w) 12857db96d56Sopenharmony_ci 12867db96d56Sopenharmony_ci def winfo_toplevel(self): 12877db96d56Sopenharmony_ci """Return the toplevel widget of this widget.""" 12887db96d56Sopenharmony_ci return self._nametowidget(self.tk.call( 12897db96d56Sopenharmony_ci 'winfo', 'toplevel', self._w)) 12907db96d56Sopenharmony_ci 12917db96d56Sopenharmony_ci def winfo_viewable(self): 12927db96d56Sopenharmony_ci """Return true if the widget and all its higher ancestors are mapped.""" 12937db96d56Sopenharmony_ci return self.tk.getint( 12947db96d56Sopenharmony_ci self.tk.call('winfo', 'viewable', self._w)) 12957db96d56Sopenharmony_ci 12967db96d56Sopenharmony_ci def winfo_visual(self): 12977db96d56Sopenharmony_ci """Return one of the strings directcolor, grayscale, pseudocolor, 12987db96d56Sopenharmony_ci staticcolor, staticgray, or truecolor for the 12997db96d56Sopenharmony_ci colormodel of this widget.""" 13007db96d56Sopenharmony_ci return self.tk.call('winfo', 'visual', self._w) 13017db96d56Sopenharmony_ci 13027db96d56Sopenharmony_ci def winfo_visualid(self): 13037db96d56Sopenharmony_ci """Return the X identifier for the visual for this widget.""" 13047db96d56Sopenharmony_ci return self.tk.call('winfo', 'visualid', self._w) 13057db96d56Sopenharmony_ci 13067db96d56Sopenharmony_ci def winfo_visualsavailable(self, includeids=False): 13077db96d56Sopenharmony_ci """Return a list of all visuals available for the screen 13087db96d56Sopenharmony_ci of this widget. 13097db96d56Sopenharmony_ci 13107db96d56Sopenharmony_ci Each item in the list consists of a visual name (see winfo_visual), a 13117db96d56Sopenharmony_ci depth and if includeids is true is given also the X identifier.""" 13127db96d56Sopenharmony_ci data = self.tk.call('winfo', 'visualsavailable', self._w, 13137db96d56Sopenharmony_ci 'includeids' if includeids else None) 13147db96d56Sopenharmony_ci data = [self.tk.splitlist(x) for x in self.tk.splitlist(data)] 13157db96d56Sopenharmony_ci return [self.__winfo_parseitem(x) for x in data] 13167db96d56Sopenharmony_ci 13177db96d56Sopenharmony_ci def __winfo_parseitem(self, t): 13187db96d56Sopenharmony_ci """Internal function.""" 13197db96d56Sopenharmony_ci return t[:1] + tuple(map(self.__winfo_getint, t[1:])) 13207db96d56Sopenharmony_ci 13217db96d56Sopenharmony_ci def __winfo_getint(self, x): 13227db96d56Sopenharmony_ci """Internal function.""" 13237db96d56Sopenharmony_ci return int(x, 0) 13247db96d56Sopenharmony_ci 13257db96d56Sopenharmony_ci def winfo_vrootheight(self): 13267db96d56Sopenharmony_ci """Return the height of the virtual root window associated with this 13277db96d56Sopenharmony_ci widget in pixels. If there is no virtual root window return the 13287db96d56Sopenharmony_ci height of the screen.""" 13297db96d56Sopenharmony_ci return self.tk.getint( 13307db96d56Sopenharmony_ci self.tk.call('winfo', 'vrootheight', self._w)) 13317db96d56Sopenharmony_ci 13327db96d56Sopenharmony_ci def winfo_vrootwidth(self): 13337db96d56Sopenharmony_ci """Return the width of the virtual root window associated with this 13347db96d56Sopenharmony_ci widget in pixel. If there is no virtual root window return the 13357db96d56Sopenharmony_ci width of the screen.""" 13367db96d56Sopenharmony_ci return self.tk.getint( 13377db96d56Sopenharmony_ci self.tk.call('winfo', 'vrootwidth', self._w)) 13387db96d56Sopenharmony_ci 13397db96d56Sopenharmony_ci def winfo_vrootx(self): 13407db96d56Sopenharmony_ci """Return the x offset of the virtual root relative to the root 13417db96d56Sopenharmony_ci window of the screen of this widget.""" 13427db96d56Sopenharmony_ci return self.tk.getint( 13437db96d56Sopenharmony_ci self.tk.call('winfo', 'vrootx', self._w)) 13447db96d56Sopenharmony_ci 13457db96d56Sopenharmony_ci def winfo_vrooty(self): 13467db96d56Sopenharmony_ci """Return the y offset of the virtual root relative to the root 13477db96d56Sopenharmony_ci window of the screen of this widget.""" 13487db96d56Sopenharmony_ci return self.tk.getint( 13497db96d56Sopenharmony_ci self.tk.call('winfo', 'vrooty', self._w)) 13507db96d56Sopenharmony_ci 13517db96d56Sopenharmony_ci def winfo_width(self): 13527db96d56Sopenharmony_ci """Return the width of this widget.""" 13537db96d56Sopenharmony_ci return self.tk.getint( 13547db96d56Sopenharmony_ci self.tk.call('winfo', 'width', self._w)) 13557db96d56Sopenharmony_ci 13567db96d56Sopenharmony_ci def winfo_x(self): 13577db96d56Sopenharmony_ci """Return the x coordinate of the upper left corner of this widget 13587db96d56Sopenharmony_ci in the parent.""" 13597db96d56Sopenharmony_ci return self.tk.getint( 13607db96d56Sopenharmony_ci self.tk.call('winfo', 'x', self._w)) 13617db96d56Sopenharmony_ci 13627db96d56Sopenharmony_ci def winfo_y(self): 13637db96d56Sopenharmony_ci """Return the y coordinate of the upper left corner of this widget 13647db96d56Sopenharmony_ci in the parent.""" 13657db96d56Sopenharmony_ci return self.tk.getint( 13667db96d56Sopenharmony_ci self.tk.call('winfo', 'y', self._w)) 13677db96d56Sopenharmony_ci 13687db96d56Sopenharmony_ci def update(self): 13697db96d56Sopenharmony_ci """Enter event loop until all pending events have been processed by Tcl.""" 13707db96d56Sopenharmony_ci self.tk.call('update') 13717db96d56Sopenharmony_ci 13727db96d56Sopenharmony_ci def update_idletasks(self): 13737db96d56Sopenharmony_ci """Enter event loop until all idle callbacks have been called. This 13747db96d56Sopenharmony_ci will update the display of windows but not process events caused by 13757db96d56Sopenharmony_ci the user.""" 13767db96d56Sopenharmony_ci self.tk.call('update', 'idletasks') 13777db96d56Sopenharmony_ci 13787db96d56Sopenharmony_ci def bindtags(self, tagList=None): 13797db96d56Sopenharmony_ci """Set or get the list of bindtags for this widget. 13807db96d56Sopenharmony_ci 13817db96d56Sopenharmony_ci With no argument return the list of all bindtags associated with 13827db96d56Sopenharmony_ci this widget. With a list of strings as argument the bindtags are 13837db96d56Sopenharmony_ci set to this list. The bindtags determine in which order events are 13847db96d56Sopenharmony_ci processed (see bind).""" 13857db96d56Sopenharmony_ci if tagList is None: 13867db96d56Sopenharmony_ci return self.tk.splitlist( 13877db96d56Sopenharmony_ci self.tk.call('bindtags', self._w)) 13887db96d56Sopenharmony_ci else: 13897db96d56Sopenharmony_ci self.tk.call('bindtags', self._w, tagList) 13907db96d56Sopenharmony_ci 13917db96d56Sopenharmony_ci def _bind(self, what, sequence, func, add, needcleanup=1): 13927db96d56Sopenharmony_ci """Internal function.""" 13937db96d56Sopenharmony_ci if isinstance(func, str): 13947db96d56Sopenharmony_ci self.tk.call(what + (sequence, func)) 13957db96d56Sopenharmony_ci elif func: 13967db96d56Sopenharmony_ci funcid = self._register(func, self._substitute, 13977db96d56Sopenharmony_ci needcleanup) 13987db96d56Sopenharmony_ci cmd = ('%sif {"[%s %s]" == "break"} break\n' 13997db96d56Sopenharmony_ci % 14007db96d56Sopenharmony_ci (add and '+' or '', 14017db96d56Sopenharmony_ci funcid, self._subst_format_str)) 14027db96d56Sopenharmony_ci self.tk.call(what + (sequence, cmd)) 14037db96d56Sopenharmony_ci return funcid 14047db96d56Sopenharmony_ci elif sequence: 14057db96d56Sopenharmony_ci return self.tk.call(what + (sequence,)) 14067db96d56Sopenharmony_ci else: 14077db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call(what)) 14087db96d56Sopenharmony_ci 14097db96d56Sopenharmony_ci def bind(self, sequence=None, func=None, add=None): 14107db96d56Sopenharmony_ci """Bind to this widget at event SEQUENCE a call to function FUNC. 14117db96d56Sopenharmony_ci 14127db96d56Sopenharmony_ci SEQUENCE is a string of concatenated event 14137db96d56Sopenharmony_ci patterns. An event pattern is of the form 14147db96d56Sopenharmony_ci <MODIFIER-MODIFIER-TYPE-DETAIL> where MODIFIER is one 14157db96d56Sopenharmony_ci of Control, Mod2, M2, Shift, Mod3, M3, Lock, Mod4, M4, 14167db96d56Sopenharmony_ci Button1, B1, Mod5, M5 Button2, B2, Meta, M, Button3, 14177db96d56Sopenharmony_ci B3, Alt, Button4, B4, Double, Button5, B5 Triple, 14187db96d56Sopenharmony_ci Mod1, M1. TYPE is one of Activate, Enter, Map, 14197db96d56Sopenharmony_ci ButtonPress, Button, Expose, Motion, ButtonRelease 14207db96d56Sopenharmony_ci FocusIn, MouseWheel, Circulate, FocusOut, Property, 14217db96d56Sopenharmony_ci Colormap, Gravity Reparent, Configure, KeyPress, Key, 14227db96d56Sopenharmony_ci Unmap, Deactivate, KeyRelease Visibility, Destroy, 14237db96d56Sopenharmony_ci Leave and DETAIL is the button number for ButtonPress, 14247db96d56Sopenharmony_ci ButtonRelease and DETAIL is the Keysym for KeyPress and 14257db96d56Sopenharmony_ci KeyRelease. Examples are 14267db96d56Sopenharmony_ci <Control-Button-1> for pressing Control and mouse button 1 or 14277db96d56Sopenharmony_ci <Alt-A> for pressing A and the Alt key (KeyPress can be omitted). 14287db96d56Sopenharmony_ci An event pattern can also be a virtual event of the form 14297db96d56Sopenharmony_ci <<AString>> where AString can be arbitrary. This 14307db96d56Sopenharmony_ci event can be generated by event_generate. 14317db96d56Sopenharmony_ci If events are concatenated they must appear shortly 14327db96d56Sopenharmony_ci after each other. 14337db96d56Sopenharmony_ci 14347db96d56Sopenharmony_ci FUNC will be called if the event sequence occurs with an 14357db96d56Sopenharmony_ci instance of Event as argument. If the return value of FUNC is 14367db96d56Sopenharmony_ci "break" no further bound function is invoked. 14377db96d56Sopenharmony_ci 14387db96d56Sopenharmony_ci An additional boolean parameter ADD specifies whether FUNC will 14397db96d56Sopenharmony_ci be called additionally to the other bound function or whether 14407db96d56Sopenharmony_ci it will replace the previous function. 14417db96d56Sopenharmony_ci 14427db96d56Sopenharmony_ci Bind will return an identifier to allow deletion of the bound function with 14437db96d56Sopenharmony_ci unbind without memory leak. 14447db96d56Sopenharmony_ci 14457db96d56Sopenharmony_ci If FUNC or SEQUENCE is omitted the bound function or list 14467db96d56Sopenharmony_ci of bound events are returned.""" 14477db96d56Sopenharmony_ci 14487db96d56Sopenharmony_ci return self._bind(('bind', self._w), sequence, func, add) 14497db96d56Sopenharmony_ci 14507db96d56Sopenharmony_ci def unbind(self, sequence, funcid=None): 14517db96d56Sopenharmony_ci """Unbind for this widget for event SEQUENCE the 14527db96d56Sopenharmony_ci function identified with FUNCID.""" 14537db96d56Sopenharmony_ci self.tk.call('bind', self._w, sequence, '') 14547db96d56Sopenharmony_ci if funcid: 14557db96d56Sopenharmony_ci self.deletecommand(funcid) 14567db96d56Sopenharmony_ci 14577db96d56Sopenharmony_ci def bind_all(self, sequence=None, func=None, add=None): 14587db96d56Sopenharmony_ci """Bind to all widgets at an event SEQUENCE a call to function FUNC. 14597db96d56Sopenharmony_ci An additional boolean parameter ADD specifies whether FUNC will 14607db96d56Sopenharmony_ci be called additionally to the other bound function or whether 14617db96d56Sopenharmony_ci it will replace the previous function. See bind for the return value.""" 14627db96d56Sopenharmony_ci return self._bind(('bind', 'all'), sequence, func, add, 0) 14637db96d56Sopenharmony_ci 14647db96d56Sopenharmony_ci def unbind_all(self, sequence): 14657db96d56Sopenharmony_ci """Unbind for all widgets for event SEQUENCE all functions.""" 14667db96d56Sopenharmony_ci self.tk.call('bind', 'all' , sequence, '') 14677db96d56Sopenharmony_ci 14687db96d56Sopenharmony_ci def bind_class(self, className, sequence=None, func=None, add=None): 14697db96d56Sopenharmony_ci """Bind to widgets with bindtag CLASSNAME at event 14707db96d56Sopenharmony_ci SEQUENCE a call of function FUNC. An additional 14717db96d56Sopenharmony_ci boolean parameter ADD specifies whether FUNC will be 14727db96d56Sopenharmony_ci called additionally to the other bound function or 14737db96d56Sopenharmony_ci whether it will replace the previous function. See bind for 14747db96d56Sopenharmony_ci the return value.""" 14757db96d56Sopenharmony_ci 14767db96d56Sopenharmony_ci return self._bind(('bind', className), sequence, func, add, 0) 14777db96d56Sopenharmony_ci 14787db96d56Sopenharmony_ci def unbind_class(self, className, sequence): 14797db96d56Sopenharmony_ci """Unbind for all widgets with bindtag CLASSNAME for event SEQUENCE 14807db96d56Sopenharmony_ci all functions.""" 14817db96d56Sopenharmony_ci self.tk.call('bind', className , sequence, '') 14827db96d56Sopenharmony_ci 14837db96d56Sopenharmony_ci def mainloop(self, n=0): 14847db96d56Sopenharmony_ci """Call the mainloop of Tk.""" 14857db96d56Sopenharmony_ci self.tk.mainloop(n) 14867db96d56Sopenharmony_ci 14877db96d56Sopenharmony_ci def quit(self): 14887db96d56Sopenharmony_ci """Quit the Tcl interpreter. All widgets will be destroyed.""" 14897db96d56Sopenharmony_ci self.tk.quit() 14907db96d56Sopenharmony_ci 14917db96d56Sopenharmony_ci def _getints(self, string): 14927db96d56Sopenharmony_ci """Internal function.""" 14937db96d56Sopenharmony_ci if string: 14947db96d56Sopenharmony_ci return tuple(map(self.tk.getint, self.tk.splitlist(string))) 14957db96d56Sopenharmony_ci 14967db96d56Sopenharmony_ci def _getdoubles(self, string): 14977db96d56Sopenharmony_ci """Internal function.""" 14987db96d56Sopenharmony_ci if string: 14997db96d56Sopenharmony_ci return tuple(map(self.tk.getdouble, self.tk.splitlist(string))) 15007db96d56Sopenharmony_ci 15017db96d56Sopenharmony_ci def _getboolean(self, string): 15027db96d56Sopenharmony_ci """Internal function.""" 15037db96d56Sopenharmony_ci if string: 15047db96d56Sopenharmony_ci return self.tk.getboolean(string) 15057db96d56Sopenharmony_ci 15067db96d56Sopenharmony_ci def _displayof(self, displayof): 15077db96d56Sopenharmony_ci """Internal function.""" 15087db96d56Sopenharmony_ci if displayof: 15097db96d56Sopenharmony_ci return ('-displayof', displayof) 15107db96d56Sopenharmony_ci if displayof is None: 15117db96d56Sopenharmony_ci return ('-displayof', self._w) 15127db96d56Sopenharmony_ci return () 15137db96d56Sopenharmony_ci 15147db96d56Sopenharmony_ci @property 15157db96d56Sopenharmony_ci def _windowingsystem(self): 15167db96d56Sopenharmony_ci """Internal function.""" 15177db96d56Sopenharmony_ci try: 15187db96d56Sopenharmony_ci return self._root()._windowingsystem_cached 15197db96d56Sopenharmony_ci except AttributeError: 15207db96d56Sopenharmony_ci ws = self._root()._windowingsystem_cached = \ 15217db96d56Sopenharmony_ci self.tk.call('tk', 'windowingsystem') 15227db96d56Sopenharmony_ci return ws 15237db96d56Sopenharmony_ci 15247db96d56Sopenharmony_ci def _options(self, cnf, kw = None): 15257db96d56Sopenharmony_ci """Internal function.""" 15267db96d56Sopenharmony_ci if kw: 15277db96d56Sopenharmony_ci cnf = _cnfmerge((cnf, kw)) 15287db96d56Sopenharmony_ci else: 15297db96d56Sopenharmony_ci cnf = _cnfmerge(cnf) 15307db96d56Sopenharmony_ci res = () 15317db96d56Sopenharmony_ci for k, v in cnf.items(): 15327db96d56Sopenharmony_ci if v is not None: 15337db96d56Sopenharmony_ci if k[-1] == '_': k = k[:-1] 15347db96d56Sopenharmony_ci if callable(v): 15357db96d56Sopenharmony_ci v = self._register(v) 15367db96d56Sopenharmony_ci elif isinstance(v, (tuple, list)): 15377db96d56Sopenharmony_ci nv = [] 15387db96d56Sopenharmony_ci for item in v: 15397db96d56Sopenharmony_ci if isinstance(item, int): 15407db96d56Sopenharmony_ci nv.append(str(item)) 15417db96d56Sopenharmony_ci elif isinstance(item, str): 15427db96d56Sopenharmony_ci nv.append(_stringify(item)) 15437db96d56Sopenharmony_ci else: 15447db96d56Sopenharmony_ci break 15457db96d56Sopenharmony_ci else: 15467db96d56Sopenharmony_ci v = ' '.join(nv) 15477db96d56Sopenharmony_ci res = res + ('-'+k, v) 15487db96d56Sopenharmony_ci return res 15497db96d56Sopenharmony_ci 15507db96d56Sopenharmony_ci def nametowidget(self, name): 15517db96d56Sopenharmony_ci """Return the Tkinter instance of a widget identified by 15527db96d56Sopenharmony_ci its Tcl name NAME.""" 15537db96d56Sopenharmony_ci name = str(name).split('.') 15547db96d56Sopenharmony_ci w = self 15557db96d56Sopenharmony_ci 15567db96d56Sopenharmony_ci if not name[0]: 15577db96d56Sopenharmony_ci w = w._root() 15587db96d56Sopenharmony_ci name = name[1:] 15597db96d56Sopenharmony_ci 15607db96d56Sopenharmony_ci for n in name: 15617db96d56Sopenharmony_ci if not n: 15627db96d56Sopenharmony_ci break 15637db96d56Sopenharmony_ci w = w.children[n] 15647db96d56Sopenharmony_ci 15657db96d56Sopenharmony_ci return w 15667db96d56Sopenharmony_ci 15677db96d56Sopenharmony_ci _nametowidget = nametowidget 15687db96d56Sopenharmony_ci 15697db96d56Sopenharmony_ci def _register(self, func, subst=None, needcleanup=1): 15707db96d56Sopenharmony_ci """Return a newly created Tcl function. If this 15717db96d56Sopenharmony_ci function is called, the Python function FUNC will 15727db96d56Sopenharmony_ci be executed. An optional function SUBST can 15737db96d56Sopenharmony_ci be given which will be executed before FUNC.""" 15747db96d56Sopenharmony_ci f = CallWrapper(func, subst, self).__call__ 15757db96d56Sopenharmony_ci name = repr(id(f)) 15767db96d56Sopenharmony_ci try: 15777db96d56Sopenharmony_ci func = func.__func__ 15787db96d56Sopenharmony_ci except AttributeError: 15797db96d56Sopenharmony_ci pass 15807db96d56Sopenharmony_ci try: 15817db96d56Sopenharmony_ci name = name + func.__name__ 15827db96d56Sopenharmony_ci except AttributeError: 15837db96d56Sopenharmony_ci pass 15847db96d56Sopenharmony_ci self.tk.createcommand(name, f) 15857db96d56Sopenharmony_ci if needcleanup: 15867db96d56Sopenharmony_ci if self._tclCommands is None: 15877db96d56Sopenharmony_ci self._tclCommands = [] 15887db96d56Sopenharmony_ci self._tclCommands.append(name) 15897db96d56Sopenharmony_ci return name 15907db96d56Sopenharmony_ci 15917db96d56Sopenharmony_ci register = _register 15927db96d56Sopenharmony_ci 15937db96d56Sopenharmony_ci def _root(self): 15947db96d56Sopenharmony_ci """Internal function.""" 15957db96d56Sopenharmony_ci w = self 15967db96d56Sopenharmony_ci while w.master is not None: w = w.master 15977db96d56Sopenharmony_ci return w 15987db96d56Sopenharmony_ci _subst_format = ('%#', '%b', '%f', '%h', '%k', 15997db96d56Sopenharmony_ci '%s', '%t', '%w', '%x', '%y', 16007db96d56Sopenharmony_ci '%A', '%E', '%K', '%N', '%W', '%T', '%X', '%Y', '%D') 16017db96d56Sopenharmony_ci _subst_format_str = " ".join(_subst_format) 16027db96d56Sopenharmony_ci 16037db96d56Sopenharmony_ci def _substitute(self, *args): 16047db96d56Sopenharmony_ci """Internal function.""" 16057db96d56Sopenharmony_ci if len(args) != len(self._subst_format): return args 16067db96d56Sopenharmony_ci getboolean = self.tk.getboolean 16077db96d56Sopenharmony_ci 16087db96d56Sopenharmony_ci getint = self.tk.getint 16097db96d56Sopenharmony_ci def getint_event(s): 16107db96d56Sopenharmony_ci """Tk changed behavior in 8.4.2, returning "??" rather more often.""" 16117db96d56Sopenharmony_ci try: 16127db96d56Sopenharmony_ci return getint(s) 16137db96d56Sopenharmony_ci except (ValueError, TclError): 16147db96d56Sopenharmony_ci return s 16157db96d56Sopenharmony_ci 16167db96d56Sopenharmony_ci nsign, b, f, h, k, s, t, w, x, y, A, E, K, N, W, T, X, Y, D = args 16177db96d56Sopenharmony_ci # Missing: (a, c, d, m, o, v, B, R) 16187db96d56Sopenharmony_ci e = Event() 16197db96d56Sopenharmony_ci # serial field: valid for all events 16207db96d56Sopenharmony_ci # number of button: ButtonPress and ButtonRelease events only 16217db96d56Sopenharmony_ci # height field: Configure, ConfigureRequest, Create, 16227db96d56Sopenharmony_ci # ResizeRequest, and Expose events only 16237db96d56Sopenharmony_ci # keycode field: KeyPress and KeyRelease events only 16247db96d56Sopenharmony_ci # time field: "valid for events that contain a time field" 16257db96d56Sopenharmony_ci # width field: Configure, ConfigureRequest, Create, ResizeRequest, 16267db96d56Sopenharmony_ci # and Expose events only 16277db96d56Sopenharmony_ci # x field: "valid for events that contain an x field" 16287db96d56Sopenharmony_ci # y field: "valid for events that contain a y field" 16297db96d56Sopenharmony_ci # keysym as decimal: KeyPress and KeyRelease events only 16307db96d56Sopenharmony_ci # x_root, y_root fields: ButtonPress, ButtonRelease, KeyPress, 16317db96d56Sopenharmony_ci # KeyRelease, and Motion events 16327db96d56Sopenharmony_ci e.serial = getint(nsign) 16337db96d56Sopenharmony_ci e.num = getint_event(b) 16347db96d56Sopenharmony_ci try: e.focus = getboolean(f) 16357db96d56Sopenharmony_ci except TclError: pass 16367db96d56Sopenharmony_ci e.height = getint_event(h) 16377db96d56Sopenharmony_ci e.keycode = getint_event(k) 16387db96d56Sopenharmony_ci e.state = getint_event(s) 16397db96d56Sopenharmony_ci e.time = getint_event(t) 16407db96d56Sopenharmony_ci e.width = getint_event(w) 16417db96d56Sopenharmony_ci e.x = getint_event(x) 16427db96d56Sopenharmony_ci e.y = getint_event(y) 16437db96d56Sopenharmony_ci e.char = A 16447db96d56Sopenharmony_ci try: e.send_event = getboolean(E) 16457db96d56Sopenharmony_ci except TclError: pass 16467db96d56Sopenharmony_ci e.keysym = K 16477db96d56Sopenharmony_ci e.keysym_num = getint_event(N) 16487db96d56Sopenharmony_ci try: 16497db96d56Sopenharmony_ci e.type = EventType(T) 16507db96d56Sopenharmony_ci except ValueError: 16517db96d56Sopenharmony_ci e.type = T 16527db96d56Sopenharmony_ci try: 16537db96d56Sopenharmony_ci e.widget = self._nametowidget(W) 16547db96d56Sopenharmony_ci except KeyError: 16557db96d56Sopenharmony_ci e.widget = W 16567db96d56Sopenharmony_ci e.x_root = getint_event(X) 16577db96d56Sopenharmony_ci e.y_root = getint_event(Y) 16587db96d56Sopenharmony_ci try: 16597db96d56Sopenharmony_ci e.delta = getint(D) 16607db96d56Sopenharmony_ci except (ValueError, TclError): 16617db96d56Sopenharmony_ci e.delta = 0 16627db96d56Sopenharmony_ci return (e,) 16637db96d56Sopenharmony_ci 16647db96d56Sopenharmony_ci def _report_exception(self): 16657db96d56Sopenharmony_ci """Internal function.""" 16667db96d56Sopenharmony_ci exc, val, tb = sys.exc_info() 16677db96d56Sopenharmony_ci root = self._root() 16687db96d56Sopenharmony_ci root.report_callback_exception(exc, val, tb) 16697db96d56Sopenharmony_ci 16707db96d56Sopenharmony_ci def _getconfigure(self, *args): 16717db96d56Sopenharmony_ci """Call Tcl configure command and return the result as a dict.""" 16727db96d56Sopenharmony_ci cnf = {} 16737db96d56Sopenharmony_ci for x in self.tk.splitlist(self.tk.call(*args)): 16747db96d56Sopenharmony_ci x = self.tk.splitlist(x) 16757db96d56Sopenharmony_ci cnf[x[0][1:]] = (x[0][1:],) + x[1:] 16767db96d56Sopenharmony_ci return cnf 16777db96d56Sopenharmony_ci 16787db96d56Sopenharmony_ci def _getconfigure1(self, *args): 16797db96d56Sopenharmony_ci x = self.tk.splitlist(self.tk.call(*args)) 16807db96d56Sopenharmony_ci return (x[0][1:],) + x[1:] 16817db96d56Sopenharmony_ci 16827db96d56Sopenharmony_ci def _configure(self, cmd, cnf, kw): 16837db96d56Sopenharmony_ci """Internal function.""" 16847db96d56Sopenharmony_ci if kw: 16857db96d56Sopenharmony_ci cnf = _cnfmerge((cnf, kw)) 16867db96d56Sopenharmony_ci elif cnf: 16877db96d56Sopenharmony_ci cnf = _cnfmerge(cnf) 16887db96d56Sopenharmony_ci if cnf is None: 16897db96d56Sopenharmony_ci return self._getconfigure(_flatten((self._w, cmd))) 16907db96d56Sopenharmony_ci if isinstance(cnf, str): 16917db96d56Sopenharmony_ci return self._getconfigure1(_flatten((self._w, cmd, '-'+cnf))) 16927db96d56Sopenharmony_ci self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) 16937db96d56Sopenharmony_ci # These used to be defined in Widget: 16947db96d56Sopenharmony_ci 16957db96d56Sopenharmony_ci def configure(self, cnf=None, **kw): 16967db96d56Sopenharmony_ci """Configure resources of a widget. 16977db96d56Sopenharmony_ci 16987db96d56Sopenharmony_ci The values for resources are specified as keyword 16997db96d56Sopenharmony_ci arguments. To get an overview about 17007db96d56Sopenharmony_ci the allowed keyword arguments call the method keys. 17017db96d56Sopenharmony_ci """ 17027db96d56Sopenharmony_ci return self._configure('configure', cnf, kw) 17037db96d56Sopenharmony_ci 17047db96d56Sopenharmony_ci config = configure 17057db96d56Sopenharmony_ci 17067db96d56Sopenharmony_ci def cget(self, key): 17077db96d56Sopenharmony_ci """Return the resource value for a KEY given as string.""" 17087db96d56Sopenharmony_ci return self.tk.call(self._w, 'cget', '-' + key) 17097db96d56Sopenharmony_ci 17107db96d56Sopenharmony_ci __getitem__ = cget 17117db96d56Sopenharmony_ci 17127db96d56Sopenharmony_ci def __setitem__(self, key, value): 17137db96d56Sopenharmony_ci self.configure({key: value}) 17147db96d56Sopenharmony_ci 17157db96d56Sopenharmony_ci def keys(self): 17167db96d56Sopenharmony_ci """Return a list of all resource names of this widget.""" 17177db96d56Sopenharmony_ci splitlist = self.tk.splitlist 17187db96d56Sopenharmony_ci return [splitlist(x)[0][1:] for x in 17197db96d56Sopenharmony_ci splitlist(self.tk.call(self._w, 'configure'))] 17207db96d56Sopenharmony_ci 17217db96d56Sopenharmony_ci def __str__(self): 17227db96d56Sopenharmony_ci """Return the window path name of this widget.""" 17237db96d56Sopenharmony_ci return self._w 17247db96d56Sopenharmony_ci 17257db96d56Sopenharmony_ci def __repr__(self): 17267db96d56Sopenharmony_ci return '<%s.%s object %s>' % ( 17277db96d56Sopenharmony_ci self.__class__.__module__, self.__class__.__qualname__, self._w) 17287db96d56Sopenharmony_ci 17297db96d56Sopenharmony_ci # Pack methods that apply to the master 17307db96d56Sopenharmony_ci _noarg_ = ['_noarg_'] 17317db96d56Sopenharmony_ci 17327db96d56Sopenharmony_ci def pack_propagate(self, flag=_noarg_): 17337db96d56Sopenharmony_ci """Set or get the status for propagation of geometry information. 17347db96d56Sopenharmony_ci 17357db96d56Sopenharmony_ci A boolean argument specifies whether the geometry information 17367db96d56Sopenharmony_ci of the slaves will determine the size of this widget. If no argument 17377db96d56Sopenharmony_ci is given the current setting will be returned. 17387db96d56Sopenharmony_ci """ 17397db96d56Sopenharmony_ci if flag is Misc._noarg_: 17407db96d56Sopenharmony_ci return self._getboolean(self.tk.call( 17417db96d56Sopenharmony_ci 'pack', 'propagate', self._w)) 17427db96d56Sopenharmony_ci else: 17437db96d56Sopenharmony_ci self.tk.call('pack', 'propagate', self._w, flag) 17447db96d56Sopenharmony_ci 17457db96d56Sopenharmony_ci propagate = pack_propagate 17467db96d56Sopenharmony_ci 17477db96d56Sopenharmony_ci def pack_slaves(self): 17487db96d56Sopenharmony_ci """Return a list of all slaves of this widget 17497db96d56Sopenharmony_ci in its packing order.""" 17507db96d56Sopenharmony_ci return [self._nametowidget(x) for x in 17517db96d56Sopenharmony_ci self.tk.splitlist( 17527db96d56Sopenharmony_ci self.tk.call('pack', 'slaves', self._w))] 17537db96d56Sopenharmony_ci 17547db96d56Sopenharmony_ci slaves = pack_slaves 17557db96d56Sopenharmony_ci 17567db96d56Sopenharmony_ci # Place method that applies to the master 17577db96d56Sopenharmony_ci def place_slaves(self): 17587db96d56Sopenharmony_ci """Return a list of all slaves of this widget 17597db96d56Sopenharmony_ci in its packing order.""" 17607db96d56Sopenharmony_ci return [self._nametowidget(x) for x in 17617db96d56Sopenharmony_ci self.tk.splitlist( 17627db96d56Sopenharmony_ci self.tk.call( 17637db96d56Sopenharmony_ci 'place', 'slaves', self._w))] 17647db96d56Sopenharmony_ci 17657db96d56Sopenharmony_ci # Grid methods that apply to the master 17667db96d56Sopenharmony_ci 17677db96d56Sopenharmony_ci def grid_anchor(self, anchor=None): # new in Tk 8.5 17687db96d56Sopenharmony_ci """The anchor value controls how to place the grid within the 17697db96d56Sopenharmony_ci master when no row/column has any weight. 17707db96d56Sopenharmony_ci 17717db96d56Sopenharmony_ci The default anchor is nw.""" 17727db96d56Sopenharmony_ci self.tk.call('grid', 'anchor', self._w, anchor) 17737db96d56Sopenharmony_ci 17747db96d56Sopenharmony_ci anchor = grid_anchor 17757db96d56Sopenharmony_ci 17767db96d56Sopenharmony_ci def grid_bbox(self, column=None, row=None, col2=None, row2=None): 17777db96d56Sopenharmony_ci """Return a tuple of integer coordinates for the bounding 17787db96d56Sopenharmony_ci box of this widget controlled by the geometry manager grid. 17797db96d56Sopenharmony_ci 17807db96d56Sopenharmony_ci If COLUMN, ROW is given the bounding box applies from 17817db96d56Sopenharmony_ci the cell with row and column 0 to the specified 17827db96d56Sopenharmony_ci cell. If COL2 and ROW2 are given the bounding box 17837db96d56Sopenharmony_ci starts at that cell. 17847db96d56Sopenharmony_ci 17857db96d56Sopenharmony_ci The returned integers specify the offset of the upper left 17867db96d56Sopenharmony_ci corner in the master widget and the width and height. 17877db96d56Sopenharmony_ci """ 17887db96d56Sopenharmony_ci args = ('grid', 'bbox', self._w) 17897db96d56Sopenharmony_ci if column is not None and row is not None: 17907db96d56Sopenharmony_ci args = args + (column, row) 17917db96d56Sopenharmony_ci if col2 is not None and row2 is not None: 17927db96d56Sopenharmony_ci args = args + (col2, row2) 17937db96d56Sopenharmony_ci return self._getints(self.tk.call(*args)) or None 17947db96d56Sopenharmony_ci 17957db96d56Sopenharmony_ci bbox = grid_bbox 17967db96d56Sopenharmony_ci 17977db96d56Sopenharmony_ci def _gridconvvalue(self, value): 17987db96d56Sopenharmony_ci if isinstance(value, (str, _tkinter.Tcl_Obj)): 17997db96d56Sopenharmony_ci try: 18007db96d56Sopenharmony_ci svalue = str(value) 18017db96d56Sopenharmony_ci if not svalue: 18027db96d56Sopenharmony_ci return None 18037db96d56Sopenharmony_ci elif '.' in svalue: 18047db96d56Sopenharmony_ci return self.tk.getdouble(svalue) 18057db96d56Sopenharmony_ci else: 18067db96d56Sopenharmony_ci return self.tk.getint(svalue) 18077db96d56Sopenharmony_ci except (ValueError, TclError): 18087db96d56Sopenharmony_ci pass 18097db96d56Sopenharmony_ci return value 18107db96d56Sopenharmony_ci 18117db96d56Sopenharmony_ci def _grid_configure(self, command, index, cnf, kw): 18127db96d56Sopenharmony_ci """Internal function.""" 18137db96d56Sopenharmony_ci if isinstance(cnf, str) and not kw: 18147db96d56Sopenharmony_ci if cnf[-1:] == '_': 18157db96d56Sopenharmony_ci cnf = cnf[:-1] 18167db96d56Sopenharmony_ci if cnf[:1] != '-': 18177db96d56Sopenharmony_ci cnf = '-'+cnf 18187db96d56Sopenharmony_ci options = (cnf,) 18197db96d56Sopenharmony_ci else: 18207db96d56Sopenharmony_ci options = self._options(cnf, kw) 18217db96d56Sopenharmony_ci if not options: 18227db96d56Sopenharmony_ci return _splitdict( 18237db96d56Sopenharmony_ci self.tk, 18247db96d56Sopenharmony_ci self.tk.call('grid', command, self._w, index), 18257db96d56Sopenharmony_ci conv=self._gridconvvalue) 18267db96d56Sopenharmony_ci res = self.tk.call( 18277db96d56Sopenharmony_ci ('grid', command, self._w, index) 18287db96d56Sopenharmony_ci + options) 18297db96d56Sopenharmony_ci if len(options) == 1: 18307db96d56Sopenharmony_ci return self._gridconvvalue(res) 18317db96d56Sopenharmony_ci 18327db96d56Sopenharmony_ci def grid_columnconfigure(self, index, cnf={}, **kw): 18337db96d56Sopenharmony_ci """Configure column INDEX of a grid. 18347db96d56Sopenharmony_ci 18357db96d56Sopenharmony_ci Valid resources are minsize (minimum size of the column), 18367db96d56Sopenharmony_ci weight (how much does additional space propagate to this column) 18377db96d56Sopenharmony_ci and pad (how much space to let additionally).""" 18387db96d56Sopenharmony_ci return self._grid_configure('columnconfigure', index, cnf, kw) 18397db96d56Sopenharmony_ci 18407db96d56Sopenharmony_ci columnconfigure = grid_columnconfigure 18417db96d56Sopenharmony_ci 18427db96d56Sopenharmony_ci def grid_location(self, x, y): 18437db96d56Sopenharmony_ci """Return a tuple of column and row which identify the cell 18447db96d56Sopenharmony_ci at which the pixel at position X and Y inside the master 18457db96d56Sopenharmony_ci widget is located.""" 18467db96d56Sopenharmony_ci return self._getints( 18477db96d56Sopenharmony_ci self.tk.call( 18487db96d56Sopenharmony_ci 'grid', 'location', self._w, x, y)) or None 18497db96d56Sopenharmony_ci 18507db96d56Sopenharmony_ci def grid_propagate(self, flag=_noarg_): 18517db96d56Sopenharmony_ci """Set or get the status for propagation of geometry information. 18527db96d56Sopenharmony_ci 18537db96d56Sopenharmony_ci A boolean argument specifies whether the geometry information 18547db96d56Sopenharmony_ci of the slaves will determine the size of this widget. If no argument 18557db96d56Sopenharmony_ci is given, the current setting will be returned. 18567db96d56Sopenharmony_ci """ 18577db96d56Sopenharmony_ci if flag is Misc._noarg_: 18587db96d56Sopenharmony_ci return self._getboolean(self.tk.call( 18597db96d56Sopenharmony_ci 'grid', 'propagate', self._w)) 18607db96d56Sopenharmony_ci else: 18617db96d56Sopenharmony_ci self.tk.call('grid', 'propagate', self._w, flag) 18627db96d56Sopenharmony_ci 18637db96d56Sopenharmony_ci def grid_rowconfigure(self, index, cnf={}, **kw): 18647db96d56Sopenharmony_ci """Configure row INDEX of a grid. 18657db96d56Sopenharmony_ci 18667db96d56Sopenharmony_ci Valid resources are minsize (minimum size of the row), 18677db96d56Sopenharmony_ci weight (how much does additional space propagate to this row) 18687db96d56Sopenharmony_ci and pad (how much space to let additionally).""" 18697db96d56Sopenharmony_ci return self._grid_configure('rowconfigure', index, cnf, kw) 18707db96d56Sopenharmony_ci 18717db96d56Sopenharmony_ci rowconfigure = grid_rowconfigure 18727db96d56Sopenharmony_ci 18737db96d56Sopenharmony_ci def grid_size(self): 18747db96d56Sopenharmony_ci """Return a tuple of the number of column and rows in the grid.""" 18757db96d56Sopenharmony_ci return self._getints( 18767db96d56Sopenharmony_ci self.tk.call('grid', 'size', self._w)) or None 18777db96d56Sopenharmony_ci 18787db96d56Sopenharmony_ci size = grid_size 18797db96d56Sopenharmony_ci 18807db96d56Sopenharmony_ci def grid_slaves(self, row=None, column=None): 18817db96d56Sopenharmony_ci """Return a list of all slaves of this widget 18827db96d56Sopenharmony_ci in its packing order.""" 18837db96d56Sopenharmony_ci args = () 18847db96d56Sopenharmony_ci if row is not None: 18857db96d56Sopenharmony_ci args = args + ('-row', row) 18867db96d56Sopenharmony_ci if column is not None: 18877db96d56Sopenharmony_ci args = args + ('-column', column) 18887db96d56Sopenharmony_ci return [self._nametowidget(x) for x in 18897db96d56Sopenharmony_ci self.tk.splitlist(self.tk.call( 18907db96d56Sopenharmony_ci ('grid', 'slaves', self._w) + args))] 18917db96d56Sopenharmony_ci 18927db96d56Sopenharmony_ci # Support for the "event" command, new in Tk 4.2. 18937db96d56Sopenharmony_ci # By Case Roole. 18947db96d56Sopenharmony_ci 18957db96d56Sopenharmony_ci def event_add(self, virtual, *sequences): 18967db96d56Sopenharmony_ci """Bind a virtual event VIRTUAL (of the form <<Name>>) 18977db96d56Sopenharmony_ci to an event SEQUENCE such that the virtual event is triggered 18987db96d56Sopenharmony_ci whenever SEQUENCE occurs.""" 18997db96d56Sopenharmony_ci args = ('event', 'add', virtual) + sequences 19007db96d56Sopenharmony_ci self.tk.call(args) 19017db96d56Sopenharmony_ci 19027db96d56Sopenharmony_ci def event_delete(self, virtual, *sequences): 19037db96d56Sopenharmony_ci """Unbind a virtual event VIRTUAL from SEQUENCE.""" 19047db96d56Sopenharmony_ci args = ('event', 'delete', virtual) + sequences 19057db96d56Sopenharmony_ci self.tk.call(args) 19067db96d56Sopenharmony_ci 19077db96d56Sopenharmony_ci def event_generate(self, sequence, **kw): 19087db96d56Sopenharmony_ci """Generate an event SEQUENCE. Additional 19097db96d56Sopenharmony_ci keyword arguments specify parameter of the event 19107db96d56Sopenharmony_ci (e.g. x, y, rootx, rooty).""" 19117db96d56Sopenharmony_ci args = ('event', 'generate', self._w, sequence) 19127db96d56Sopenharmony_ci for k, v in kw.items(): 19137db96d56Sopenharmony_ci args = args + ('-%s' % k, str(v)) 19147db96d56Sopenharmony_ci self.tk.call(args) 19157db96d56Sopenharmony_ci 19167db96d56Sopenharmony_ci def event_info(self, virtual=None): 19177db96d56Sopenharmony_ci """Return a list of all virtual events or the information 19187db96d56Sopenharmony_ci about the SEQUENCE bound to the virtual event VIRTUAL.""" 19197db96d56Sopenharmony_ci return self.tk.splitlist( 19207db96d56Sopenharmony_ci self.tk.call('event', 'info', virtual)) 19217db96d56Sopenharmony_ci 19227db96d56Sopenharmony_ci # Image related commands 19237db96d56Sopenharmony_ci 19247db96d56Sopenharmony_ci def image_names(self): 19257db96d56Sopenharmony_ci """Return a list of all existing image names.""" 19267db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call('image', 'names')) 19277db96d56Sopenharmony_ci 19287db96d56Sopenharmony_ci def image_types(self): 19297db96d56Sopenharmony_ci """Return a list of all available image types (e.g. photo bitmap).""" 19307db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call('image', 'types')) 19317db96d56Sopenharmony_ci 19327db96d56Sopenharmony_ci 19337db96d56Sopenharmony_ciclass CallWrapper: 19347db96d56Sopenharmony_ci """Internal class. Stores function to call when some user 19357db96d56Sopenharmony_ci defined Tcl function is called e.g. after an event occurred.""" 19367db96d56Sopenharmony_ci 19377db96d56Sopenharmony_ci def __init__(self, func, subst, widget): 19387db96d56Sopenharmony_ci """Store FUNC, SUBST and WIDGET as members.""" 19397db96d56Sopenharmony_ci self.func = func 19407db96d56Sopenharmony_ci self.subst = subst 19417db96d56Sopenharmony_ci self.widget = widget 19427db96d56Sopenharmony_ci 19437db96d56Sopenharmony_ci def __call__(self, *args): 19447db96d56Sopenharmony_ci """Apply first function SUBST to arguments, than FUNC.""" 19457db96d56Sopenharmony_ci try: 19467db96d56Sopenharmony_ci if self.subst: 19477db96d56Sopenharmony_ci args = self.subst(*args) 19487db96d56Sopenharmony_ci return self.func(*args) 19497db96d56Sopenharmony_ci except SystemExit: 19507db96d56Sopenharmony_ci raise 19517db96d56Sopenharmony_ci except: 19527db96d56Sopenharmony_ci self.widget._report_exception() 19537db96d56Sopenharmony_ci 19547db96d56Sopenharmony_ci 19557db96d56Sopenharmony_ciclass XView: 19567db96d56Sopenharmony_ci """Mix-in class for querying and changing the horizontal position 19577db96d56Sopenharmony_ci of a widget's window.""" 19587db96d56Sopenharmony_ci 19597db96d56Sopenharmony_ci def xview(self, *args): 19607db96d56Sopenharmony_ci """Query and change the horizontal position of the view.""" 19617db96d56Sopenharmony_ci res = self.tk.call(self._w, 'xview', *args) 19627db96d56Sopenharmony_ci if not args: 19637db96d56Sopenharmony_ci return self._getdoubles(res) 19647db96d56Sopenharmony_ci 19657db96d56Sopenharmony_ci def xview_moveto(self, fraction): 19667db96d56Sopenharmony_ci """Adjusts the view in the window so that FRACTION of the 19677db96d56Sopenharmony_ci total width of the canvas is off-screen to the left.""" 19687db96d56Sopenharmony_ci self.tk.call(self._w, 'xview', 'moveto', fraction) 19697db96d56Sopenharmony_ci 19707db96d56Sopenharmony_ci def xview_scroll(self, number, what): 19717db96d56Sopenharmony_ci """Shift the x-view according to NUMBER which is measured in "units" 19727db96d56Sopenharmony_ci or "pages" (WHAT).""" 19737db96d56Sopenharmony_ci self.tk.call(self._w, 'xview', 'scroll', number, what) 19747db96d56Sopenharmony_ci 19757db96d56Sopenharmony_ci 19767db96d56Sopenharmony_ciclass YView: 19777db96d56Sopenharmony_ci """Mix-in class for querying and changing the vertical position 19787db96d56Sopenharmony_ci of a widget's window.""" 19797db96d56Sopenharmony_ci 19807db96d56Sopenharmony_ci def yview(self, *args): 19817db96d56Sopenharmony_ci """Query and change the vertical position of the view.""" 19827db96d56Sopenharmony_ci res = self.tk.call(self._w, 'yview', *args) 19837db96d56Sopenharmony_ci if not args: 19847db96d56Sopenharmony_ci return self._getdoubles(res) 19857db96d56Sopenharmony_ci 19867db96d56Sopenharmony_ci def yview_moveto(self, fraction): 19877db96d56Sopenharmony_ci """Adjusts the view in the window so that FRACTION of the 19887db96d56Sopenharmony_ci total height of the canvas is off-screen to the top.""" 19897db96d56Sopenharmony_ci self.tk.call(self._w, 'yview', 'moveto', fraction) 19907db96d56Sopenharmony_ci 19917db96d56Sopenharmony_ci def yview_scroll(self, number, what): 19927db96d56Sopenharmony_ci """Shift the y-view according to NUMBER which is measured in 19937db96d56Sopenharmony_ci "units" or "pages" (WHAT).""" 19947db96d56Sopenharmony_ci self.tk.call(self._w, 'yview', 'scroll', number, what) 19957db96d56Sopenharmony_ci 19967db96d56Sopenharmony_ci 19977db96d56Sopenharmony_ciclass Wm: 19987db96d56Sopenharmony_ci """Provides functions for the communication with the window manager.""" 19997db96d56Sopenharmony_ci 20007db96d56Sopenharmony_ci def wm_aspect(self, 20017db96d56Sopenharmony_ci minNumer=None, minDenom=None, 20027db96d56Sopenharmony_ci maxNumer=None, maxDenom=None): 20037db96d56Sopenharmony_ci """Instruct the window manager to set the aspect ratio (width/height) 20047db96d56Sopenharmony_ci of this widget to be between MINNUMER/MINDENOM and MAXNUMER/MAXDENOM. Return a tuple 20057db96d56Sopenharmony_ci of the actual values if no argument is given.""" 20067db96d56Sopenharmony_ci return self._getints( 20077db96d56Sopenharmony_ci self.tk.call('wm', 'aspect', self._w, 20087db96d56Sopenharmony_ci minNumer, minDenom, 20097db96d56Sopenharmony_ci maxNumer, maxDenom)) 20107db96d56Sopenharmony_ci 20117db96d56Sopenharmony_ci aspect = wm_aspect 20127db96d56Sopenharmony_ci 20137db96d56Sopenharmony_ci def wm_attributes(self, *args): 20147db96d56Sopenharmony_ci """This subcommand returns or sets platform specific attributes 20157db96d56Sopenharmony_ci 20167db96d56Sopenharmony_ci The first form returns a list of the platform specific flags and 20177db96d56Sopenharmony_ci their values. The second form returns the value for the specific 20187db96d56Sopenharmony_ci option. The third form sets one or more of the values. The values 20197db96d56Sopenharmony_ci are as follows: 20207db96d56Sopenharmony_ci 20217db96d56Sopenharmony_ci On Windows, -disabled gets or sets whether the window is in a 20227db96d56Sopenharmony_ci disabled state. -toolwindow gets or sets the style of the window 20237db96d56Sopenharmony_ci to toolwindow (as defined in the MSDN). -topmost gets or sets 20247db96d56Sopenharmony_ci whether this is a topmost window (displays above all other 20257db96d56Sopenharmony_ci windows). 20267db96d56Sopenharmony_ci 20277db96d56Sopenharmony_ci On Macintosh, XXXXX 20287db96d56Sopenharmony_ci 20297db96d56Sopenharmony_ci On Unix, there are currently no special attribute values. 20307db96d56Sopenharmony_ci """ 20317db96d56Sopenharmony_ci args = ('wm', 'attributes', self._w) + args 20327db96d56Sopenharmony_ci return self.tk.call(args) 20337db96d56Sopenharmony_ci 20347db96d56Sopenharmony_ci attributes = wm_attributes 20357db96d56Sopenharmony_ci 20367db96d56Sopenharmony_ci def wm_client(self, name=None): 20377db96d56Sopenharmony_ci """Store NAME in WM_CLIENT_MACHINE property of this widget. Return 20387db96d56Sopenharmony_ci current value.""" 20397db96d56Sopenharmony_ci return self.tk.call('wm', 'client', self._w, name) 20407db96d56Sopenharmony_ci 20417db96d56Sopenharmony_ci client = wm_client 20427db96d56Sopenharmony_ci 20437db96d56Sopenharmony_ci def wm_colormapwindows(self, *wlist): 20447db96d56Sopenharmony_ci """Store list of window names (WLIST) into WM_COLORMAPWINDOWS property 20457db96d56Sopenharmony_ci of this widget. This list contains windows whose colormaps differ from their 20467db96d56Sopenharmony_ci parents. Return current list of widgets if WLIST is empty.""" 20477db96d56Sopenharmony_ci if len(wlist) > 1: 20487db96d56Sopenharmony_ci wlist = (wlist,) # Tk needs a list of windows here 20497db96d56Sopenharmony_ci args = ('wm', 'colormapwindows', self._w) + wlist 20507db96d56Sopenharmony_ci if wlist: 20517db96d56Sopenharmony_ci self.tk.call(args) 20527db96d56Sopenharmony_ci else: 20537db96d56Sopenharmony_ci return [self._nametowidget(x) 20547db96d56Sopenharmony_ci for x in self.tk.splitlist(self.tk.call(args))] 20557db96d56Sopenharmony_ci 20567db96d56Sopenharmony_ci colormapwindows = wm_colormapwindows 20577db96d56Sopenharmony_ci 20587db96d56Sopenharmony_ci def wm_command(self, value=None): 20597db96d56Sopenharmony_ci """Store VALUE in WM_COMMAND property. It is the command 20607db96d56Sopenharmony_ci which shall be used to invoke the application. Return current 20617db96d56Sopenharmony_ci command if VALUE is None.""" 20627db96d56Sopenharmony_ci return self.tk.call('wm', 'command', self._w, value) 20637db96d56Sopenharmony_ci 20647db96d56Sopenharmony_ci command = wm_command 20657db96d56Sopenharmony_ci 20667db96d56Sopenharmony_ci def wm_deiconify(self): 20677db96d56Sopenharmony_ci """Deiconify this widget. If it was never mapped it will not be mapped. 20687db96d56Sopenharmony_ci On Windows it will raise this widget and give it the focus.""" 20697db96d56Sopenharmony_ci return self.tk.call('wm', 'deiconify', self._w) 20707db96d56Sopenharmony_ci 20717db96d56Sopenharmony_ci deiconify = wm_deiconify 20727db96d56Sopenharmony_ci 20737db96d56Sopenharmony_ci def wm_focusmodel(self, model=None): 20747db96d56Sopenharmony_ci """Set focus model to MODEL. "active" means that this widget will claim 20757db96d56Sopenharmony_ci the focus itself, "passive" means that the window manager shall give 20767db96d56Sopenharmony_ci the focus. Return current focus model if MODEL is None.""" 20777db96d56Sopenharmony_ci return self.tk.call('wm', 'focusmodel', self._w, model) 20787db96d56Sopenharmony_ci 20797db96d56Sopenharmony_ci focusmodel = wm_focusmodel 20807db96d56Sopenharmony_ci 20817db96d56Sopenharmony_ci def wm_forget(self, window): # new in Tk 8.5 20827db96d56Sopenharmony_ci """The window will be unmapped from the screen and will no longer 20837db96d56Sopenharmony_ci be managed by wm. toplevel windows will be treated like frame 20847db96d56Sopenharmony_ci windows once they are no longer managed by wm, however, the menu 20857db96d56Sopenharmony_ci option configuration will be remembered and the menus will return 20867db96d56Sopenharmony_ci once the widget is managed again.""" 20877db96d56Sopenharmony_ci self.tk.call('wm', 'forget', window) 20887db96d56Sopenharmony_ci 20897db96d56Sopenharmony_ci forget = wm_forget 20907db96d56Sopenharmony_ci 20917db96d56Sopenharmony_ci def wm_frame(self): 20927db96d56Sopenharmony_ci """Return identifier for decorative frame of this widget if present.""" 20937db96d56Sopenharmony_ci return self.tk.call('wm', 'frame', self._w) 20947db96d56Sopenharmony_ci 20957db96d56Sopenharmony_ci frame = wm_frame 20967db96d56Sopenharmony_ci 20977db96d56Sopenharmony_ci def wm_geometry(self, newGeometry=None): 20987db96d56Sopenharmony_ci """Set geometry to NEWGEOMETRY of the form =widthxheight+x+y. Return 20997db96d56Sopenharmony_ci current value if None is given.""" 21007db96d56Sopenharmony_ci return self.tk.call('wm', 'geometry', self._w, newGeometry) 21017db96d56Sopenharmony_ci 21027db96d56Sopenharmony_ci geometry = wm_geometry 21037db96d56Sopenharmony_ci 21047db96d56Sopenharmony_ci def wm_grid(self, 21057db96d56Sopenharmony_ci baseWidth=None, baseHeight=None, 21067db96d56Sopenharmony_ci widthInc=None, heightInc=None): 21077db96d56Sopenharmony_ci """Instruct the window manager that this widget shall only be 21087db96d56Sopenharmony_ci resized on grid boundaries. WIDTHINC and HEIGHTINC are the width and 21097db96d56Sopenharmony_ci height of a grid unit in pixels. BASEWIDTH and BASEHEIGHT are the 21107db96d56Sopenharmony_ci number of grid units requested in Tk_GeometryRequest.""" 21117db96d56Sopenharmony_ci return self._getints(self.tk.call( 21127db96d56Sopenharmony_ci 'wm', 'grid', self._w, 21137db96d56Sopenharmony_ci baseWidth, baseHeight, widthInc, heightInc)) 21147db96d56Sopenharmony_ci 21157db96d56Sopenharmony_ci grid = wm_grid 21167db96d56Sopenharmony_ci 21177db96d56Sopenharmony_ci def wm_group(self, pathName=None): 21187db96d56Sopenharmony_ci """Set the group leader widgets for related widgets to PATHNAME. Return 21197db96d56Sopenharmony_ci the group leader of this widget if None is given.""" 21207db96d56Sopenharmony_ci return self.tk.call('wm', 'group', self._w, pathName) 21217db96d56Sopenharmony_ci 21227db96d56Sopenharmony_ci group = wm_group 21237db96d56Sopenharmony_ci 21247db96d56Sopenharmony_ci def wm_iconbitmap(self, bitmap=None, default=None): 21257db96d56Sopenharmony_ci """Set bitmap for the iconified widget to BITMAP. Return 21267db96d56Sopenharmony_ci the bitmap if None is given. 21277db96d56Sopenharmony_ci 21287db96d56Sopenharmony_ci Under Windows, the DEFAULT parameter can be used to set the icon 21297db96d56Sopenharmony_ci for the widget and any descendants that don't have an icon set 21307db96d56Sopenharmony_ci explicitly. DEFAULT can be the relative path to a .ico file 21317db96d56Sopenharmony_ci (example: root.iconbitmap(default='myicon.ico') ). See Tk 21327db96d56Sopenharmony_ci documentation for more information.""" 21337db96d56Sopenharmony_ci if default: 21347db96d56Sopenharmony_ci return self.tk.call('wm', 'iconbitmap', self._w, '-default', default) 21357db96d56Sopenharmony_ci else: 21367db96d56Sopenharmony_ci return self.tk.call('wm', 'iconbitmap', self._w, bitmap) 21377db96d56Sopenharmony_ci 21387db96d56Sopenharmony_ci iconbitmap = wm_iconbitmap 21397db96d56Sopenharmony_ci 21407db96d56Sopenharmony_ci def wm_iconify(self): 21417db96d56Sopenharmony_ci """Display widget as icon.""" 21427db96d56Sopenharmony_ci return self.tk.call('wm', 'iconify', self._w) 21437db96d56Sopenharmony_ci 21447db96d56Sopenharmony_ci iconify = wm_iconify 21457db96d56Sopenharmony_ci 21467db96d56Sopenharmony_ci def wm_iconmask(self, bitmap=None): 21477db96d56Sopenharmony_ci """Set mask for the icon bitmap of this widget. Return the 21487db96d56Sopenharmony_ci mask if None is given.""" 21497db96d56Sopenharmony_ci return self.tk.call('wm', 'iconmask', self._w, bitmap) 21507db96d56Sopenharmony_ci 21517db96d56Sopenharmony_ci iconmask = wm_iconmask 21527db96d56Sopenharmony_ci 21537db96d56Sopenharmony_ci def wm_iconname(self, newName=None): 21547db96d56Sopenharmony_ci """Set the name of the icon for this widget. Return the name if 21557db96d56Sopenharmony_ci None is given.""" 21567db96d56Sopenharmony_ci return self.tk.call('wm', 'iconname', self._w, newName) 21577db96d56Sopenharmony_ci 21587db96d56Sopenharmony_ci iconname = wm_iconname 21597db96d56Sopenharmony_ci 21607db96d56Sopenharmony_ci def wm_iconphoto(self, default=False, *args): # new in Tk 8.5 21617db96d56Sopenharmony_ci """Sets the titlebar icon for this window based on the named photo 21627db96d56Sopenharmony_ci images passed through args. If default is True, this is applied to 21637db96d56Sopenharmony_ci all future created toplevels as well. 21647db96d56Sopenharmony_ci 21657db96d56Sopenharmony_ci The data in the images is taken as a snapshot at the time of 21667db96d56Sopenharmony_ci invocation. If the images are later changed, this is not reflected 21677db96d56Sopenharmony_ci to the titlebar icons. Multiple images are accepted to allow 21687db96d56Sopenharmony_ci different images sizes to be provided. The window manager may scale 21697db96d56Sopenharmony_ci provided icons to an appropriate size. 21707db96d56Sopenharmony_ci 21717db96d56Sopenharmony_ci On Windows, the images are packed into a Windows icon structure. 21727db96d56Sopenharmony_ci This will override an icon specified to wm_iconbitmap, and vice 21737db96d56Sopenharmony_ci versa. 21747db96d56Sopenharmony_ci 21757db96d56Sopenharmony_ci On X, the images are arranged into the _NET_WM_ICON X property, 21767db96d56Sopenharmony_ci which most modern window managers support. An icon specified by 21777db96d56Sopenharmony_ci wm_iconbitmap may exist simultaneously. 21787db96d56Sopenharmony_ci 21797db96d56Sopenharmony_ci On Macintosh, this currently does nothing.""" 21807db96d56Sopenharmony_ci if default: 21817db96d56Sopenharmony_ci self.tk.call('wm', 'iconphoto', self._w, "-default", *args) 21827db96d56Sopenharmony_ci else: 21837db96d56Sopenharmony_ci self.tk.call('wm', 'iconphoto', self._w, *args) 21847db96d56Sopenharmony_ci 21857db96d56Sopenharmony_ci iconphoto = wm_iconphoto 21867db96d56Sopenharmony_ci 21877db96d56Sopenharmony_ci def wm_iconposition(self, x=None, y=None): 21887db96d56Sopenharmony_ci """Set the position of the icon of this widget to X and Y. Return 21897db96d56Sopenharmony_ci a tuple of the current values of X and X if None is given.""" 21907db96d56Sopenharmony_ci return self._getints(self.tk.call( 21917db96d56Sopenharmony_ci 'wm', 'iconposition', self._w, x, y)) 21927db96d56Sopenharmony_ci 21937db96d56Sopenharmony_ci iconposition = wm_iconposition 21947db96d56Sopenharmony_ci 21957db96d56Sopenharmony_ci def wm_iconwindow(self, pathName=None): 21967db96d56Sopenharmony_ci """Set widget PATHNAME to be displayed instead of icon. Return the current 21977db96d56Sopenharmony_ci value if None is given.""" 21987db96d56Sopenharmony_ci return self.tk.call('wm', 'iconwindow', self._w, pathName) 21997db96d56Sopenharmony_ci 22007db96d56Sopenharmony_ci iconwindow = wm_iconwindow 22017db96d56Sopenharmony_ci 22027db96d56Sopenharmony_ci def wm_manage(self, widget): # new in Tk 8.5 22037db96d56Sopenharmony_ci """The widget specified will become a stand alone top-level window. 22047db96d56Sopenharmony_ci The window will be decorated with the window managers title bar, 22057db96d56Sopenharmony_ci etc.""" 22067db96d56Sopenharmony_ci self.tk.call('wm', 'manage', widget) 22077db96d56Sopenharmony_ci 22087db96d56Sopenharmony_ci manage = wm_manage 22097db96d56Sopenharmony_ci 22107db96d56Sopenharmony_ci def wm_maxsize(self, width=None, height=None): 22117db96d56Sopenharmony_ci """Set max WIDTH and HEIGHT for this widget. If the window is gridded 22127db96d56Sopenharmony_ci the values are given in grid units. Return the current values if None 22137db96d56Sopenharmony_ci is given.""" 22147db96d56Sopenharmony_ci return self._getints(self.tk.call( 22157db96d56Sopenharmony_ci 'wm', 'maxsize', self._w, width, height)) 22167db96d56Sopenharmony_ci 22177db96d56Sopenharmony_ci maxsize = wm_maxsize 22187db96d56Sopenharmony_ci 22197db96d56Sopenharmony_ci def wm_minsize(self, width=None, height=None): 22207db96d56Sopenharmony_ci """Set min WIDTH and HEIGHT for this widget. If the window is gridded 22217db96d56Sopenharmony_ci the values are given in grid units. Return the current values if None 22227db96d56Sopenharmony_ci is given.""" 22237db96d56Sopenharmony_ci return self._getints(self.tk.call( 22247db96d56Sopenharmony_ci 'wm', 'minsize', self._w, width, height)) 22257db96d56Sopenharmony_ci 22267db96d56Sopenharmony_ci minsize = wm_minsize 22277db96d56Sopenharmony_ci 22287db96d56Sopenharmony_ci def wm_overrideredirect(self, boolean=None): 22297db96d56Sopenharmony_ci """Instruct the window manager to ignore this widget 22307db96d56Sopenharmony_ci if BOOLEAN is given with 1. Return the current value if None 22317db96d56Sopenharmony_ci is given.""" 22327db96d56Sopenharmony_ci return self._getboolean(self.tk.call( 22337db96d56Sopenharmony_ci 'wm', 'overrideredirect', self._w, boolean)) 22347db96d56Sopenharmony_ci 22357db96d56Sopenharmony_ci overrideredirect = wm_overrideredirect 22367db96d56Sopenharmony_ci 22377db96d56Sopenharmony_ci def wm_positionfrom(self, who=None): 22387db96d56Sopenharmony_ci """Instruct the window manager that the position of this widget shall 22397db96d56Sopenharmony_ci be defined by the user if WHO is "user", and by its own policy if WHO is 22407db96d56Sopenharmony_ci "program".""" 22417db96d56Sopenharmony_ci return self.tk.call('wm', 'positionfrom', self._w, who) 22427db96d56Sopenharmony_ci 22437db96d56Sopenharmony_ci positionfrom = wm_positionfrom 22447db96d56Sopenharmony_ci 22457db96d56Sopenharmony_ci def wm_protocol(self, name=None, func=None): 22467db96d56Sopenharmony_ci """Bind function FUNC to command NAME for this widget. 22477db96d56Sopenharmony_ci Return the function bound to NAME if None is given. NAME could be 22487db96d56Sopenharmony_ci e.g. "WM_SAVE_YOURSELF" or "WM_DELETE_WINDOW".""" 22497db96d56Sopenharmony_ci if callable(func): 22507db96d56Sopenharmony_ci command = self._register(func) 22517db96d56Sopenharmony_ci else: 22527db96d56Sopenharmony_ci command = func 22537db96d56Sopenharmony_ci return self.tk.call( 22547db96d56Sopenharmony_ci 'wm', 'protocol', self._w, name, command) 22557db96d56Sopenharmony_ci 22567db96d56Sopenharmony_ci protocol = wm_protocol 22577db96d56Sopenharmony_ci 22587db96d56Sopenharmony_ci def wm_resizable(self, width=None, height=None): 22597db96d56Sopenharmony_ci """Instruct the window manager whether this width can be resized 22607db96d56Sopenharmony_ci in WIDTH or HEIGHT. Both values are boolean values.""" 22617db96d56Sopenharmony_ci return self.tk.call('wm', 'resizable', self._w, width, height) 22627db96d56Sopenharmony_ci 22637db96d56Sopenharmony_ci resizable = wm_resizable 22647db96d56Sopenharmony_ci 22657db96d56Sopenharmony_ci def wm_sizefrom(self, who=None): 22667db96d56Sopenharmony_ci """Instruct the window manager that the size of this widget shall 22677db96d56Sopenharmony_ci be defined by the user if WHO is "user", and by its own policy if WHO is 22687db96d56Sopenharmony_ci "program".""" 22697db96d56Sopenharmony_ci return self.tk.call('wm', 'sizefrom', self._w, who) 22707db96d56Sopenharmony_ci 22717db96d56Sopenharmony_ci sizefrom = wm_sizefrom 22727db96d56Sopenharmony_ci 22737db96d56Sopenharmony_ci def wm_state(self, newstate=None): 22747db96d56Sopenharmony_ci """Query or set the state of this widget as one of normal, icon, 22757db96d56Sopenharmony_ci iconic (see wm_iconwindow), withdrawn, or zoomed (Windows only).""" 22767db96d56Sopenharmony_ci return self.tk.call('wm', 'state', self._w, newstate) 22777db96d56Sopenharmony_ci 22787db96d56Sopenharmony_ci state = wm_state 22797db96d56Sopenharmony_ci 22807db96d56Sopenharmony_ci def wm_title(self, string=None): 22817db96d56Sopenharmony_ci """Set the title of this widget.""" 22827db96d56Sopenharmony_ci return self.tk.call('wm', 'title', self._w, string) 22837db96d56Sopenharmony_ci 22847db96d56Sopenharmony_ci title = wm_title 22857db96d56Sopenharmony_ci 22867db96d56Sopenharmony_ci def wm_transient(self, master=None): 22877db96d56Sopenharmony_ci """Instruct the window manager that this widget is transient 22887db96d56Sopenharmony_ci with regard to widget MASTER.""" 22897db96d56Sopenharmony_ci return self.tk.call('wm', 'transient', self._w, master) 22907db96d56Sopenharmony_ci 22917db96d56Sopenharmony_ci transient = wm_transient 22927db96d56Sopenharmony_ci 22937db96d56Sopenharmony_ci def wm_withdraw(self): 22947db96d56Sopenharmony_ci """Withdraw this widget from the screen such that it is unmapped 22957db96d56Sopenharmony_ci and forgotten by the window manager. Re-draw it with wm_deiconify.""" 22967db96d56Sopenharmony_ci return self.tk.call('wm', 'withdraw', self._w) 22977db96d56Sopenharmony_ci 22987db96d56Sopenharmony_ci withdraw = wm_withdraw 22997db96d56Sopenharmony_ci 23007db96d56Sopenharmony_ci 23017db96d56Sopenharmony_ciclass Tk(Misc, Wm): 23027db96d56Sopenharmony_ci """Toplevel widget of Tk which represents mostly the main window 23037db96d56Sopenharmony_ci of an application. It has an associated Tcl interpreter.""" 23047db96d56Sopenharmony_ci _w = '.' 23057db96d56Sopenharmony_ci 23067db96d56Sopenharmony_ci def __init__(self, screenName=None, baseName=None, className='Tk', 23077db96d56Sopenharmony_ci useTk=True, sync=False, use=None): 23087db96d56Sopenharmony_ci """Return a new top level widget on screen SCREENNAME. A new Tcl interpreter will 23097db96d56Sopenharmony_ci be created. BASENAME will be used for the identification of the profile file (see 23107db96d56Sopenharmony_ci readprofile). 23117db96d56Sopenharmony_ci It is constructed from sys.argv[0] without extensions if None is given. CLASSNAME 23127db96d56Sopenharmony_ci is the name of the widget class.""" 23137db96d56Sopenharmony_ci self.master = None 23147db96d56Sopenharmony_ci self.children = {} 23157db96d56Sopenharmony_ci self._tkloaded = False 23167db96d56Sopenharmony_ci # to avoid recursions in the getattr code in case of failure, we 23177db96d56Sopenharmony_ci # ensure that self.tk is always _something_. 23187db96d56Sopenharmony_ci self.tk = None 23197db96d56Sopenharmony_ci if baseName is None: 23207db96d56Sopenharmony_ci import os 23217db96d56Sopenharmony_ci baseName = os.path.basename(sys.argv[0]) 23227db96d56Sopenharmony_ci baseName, ext = os.path.splitext(baseName) 23237db96d56Sopenharmony_ci if ext not in ('.py', '.pyc'): 23247db96d56Sopenharmony_ci baseName = baseName + ext 23257db96d56Sopenharmony_ci interactive = False 23267db96d56Sopenharmony_ci self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use) 23277db96d56Sopenharmony_ci if useTk: 23287db96d56Sopenharmony_ci self._loadtk() 23297db96d56Sopenharmony_ci if not sys.flags.ignore_environment: 23307db96d56Sopenharmony_ci # Issue #16248: Honor the -E flag to avoid code injection. 23317db96d56Sopenharmony_ci self.readprofile(baseName, className) 23327db96d56Sopenharmony_ci 23337db96d56Sopenharmony_ci def loadtk(self): 23347db96d56Sopenharmony_ci if not self._tkloaded: 23357db96d56Sopenharmony_ci self.tk.loadtk() 23367db96d56Sopenharmony_ci self._loadtk() 23377db96d56Sopenharmony_ci 23387db96d56Sopenharmony_ci def _loadtk(self): 23397db96d56Sopenharmony_ci self._tkloaded = True 23407db96d56Sopenharmony_ci global _default_root 23417db96d56Sopenharmony_ci # Version sanity checks 23427db96d56Sopenharmony_ci tk_version = self.tk.getvar('tk_version') 23437db96d56Sopenharmony_ci if tk_version != _tkinter.TK_VERSION: 23447db96d56Sopenharmony_ci raise RuntimeError("tk.h version (%s) doesn't match libtk.a version (%s)" 23457db96d56Sopenharmony_ci % (_tkinter.TK_VERSION, tk_version)) 23467db96d56Sopenharmony_ci # Under unknown circumstances, tcl_version gets coerced to float 23477db96d56Sopenharmony_ci tcl_version = str(self.tk.getvar('tcl_version')) 23487db96d56Sopenharmony_ci if tcl_version != _tkinter.TCL_VERSION: 23497db96d56Sopenharmony_ci raise RuntimeError("tcl.h version (%s) doesn't match libtcl.a version (%s)" \ 23507db96d56Sopenharmony_ci % (_tkinter.TCL_VERSION, tcl_version)) 23517db96d56Sopenharmony_ci # Create and register the tkerror and exit commands 23527db96d56Sopenharmony_ci # We need to inline parts of _register here, _ register 23537db96d56Sopenharmony_ci # would register differently-named commands. 23547db96d56Sopenharmony_ci if self._tclCommands is None: 23557db96d56Sopenharmony_ci self._tclCommands = [] 23567db96d56Sopenharmony_ci self.tk.createcommand('tkerror', _tkerror) 23577db96d56Sopenharmony_ci self.tk.createcommand('exit', _exit) 23587db96d56Sopenharmony_ci self._tclCommands.append('tkerror') 23597db96d56Sopenharmony_ci self._tclCommands.append('exit') 23607db96d56Sopenharmony_ci if _support_default_root and _default_root is None: 23617db96d56Sopenharmony_ci _default_root = self 23627db96d56Sopenharmony_ci self.protocol("WM_DELETE_WINDOW", self.destroy) 23637db96d56Sopenharmony_ci 23647db96d56Sopenharmony_ci def destroy(self): 23657db96d56Sopenharmony_ci """Destroy this and all descendants widgets. This will 23667db96d56Sopenharmony_ci end the application of this Tcl interpreter.""" 23677db96d56Sopenharmony_ci for c in list(self.children.values()): c.destroy() 23687db96d56Sopenharmony_ci self.tk.call('destroy', self._w) 23697db96d56Sopenharmony_ci Misc.destroy(self) 23707db96d56Sopenharmony_ci global _default_root 23717db96d56Sopenharmony_ci if _support_default_root and _default_root is self: 23727db96d56Sopenharmony_ci _default_root = None 23737db96d56Sopenharmony_ci 23747db96d56Sopenharmony_ci def readprofile(self, baseName, className): 23757db96d56Sopenharmony_ci """Internal function. It reads .BASENAME.tcl and .CLASSNAME.tcl into 23767db96d56Sopenharmony_ci the Tcl Interpreter and calls exec on the contents of .BASENAME.py and 23777db96d56Sopenharmony_ci .CLASSNAME.py if such a file exists in the home directory.""" 23787db96d56Sopenharmony_ci import os 23797db96d56Sopenharmony_ci if 'HOME' in os.environ: home = os.environ['HOME'] 23807db96d56Sopenharmony_ci else: home = os.curdir 23817db96d56Sopenharmony_ci class_tcl = os.path.join(home, '.%s.tcl' % className) 23827db96d56Sopenharmony_ci class_py = os.path.join(home, '.%s.py' % className) 23837db96d56Sopenharmony_ci base_tcl = os.path.join(home, '.%s.tcl' % baseName) 23847db96d56Sopenharmony_ci base_py = os.path.join(home, '.%s.py' % baseName) 23857db96d56Sopenharmony_ci dir = {'self': self} 23867db96d56Sopenharmony_ci exec('from tkinter import *', dir) 23877db96d56Sopenharmony_ci if os.path.isfile(class_tcl): 23887db96d56Sopenharmony_ci self.tk.call('source', class_tcl) 23897db96d56Sopenharmony_ci if os.path.isfile(class_py): 23907db96d56Sopenharmony_ci exec(open(class_py).read(), dir) 23917db96d56Sopenharmony_ci if os.path.isfile(base_tcl): 23927db96d56Sopenharmony_ci self.tk.call('source', base_tcl) 23937db96d56Sopenharmony_ci if os.path.isfile(base_py): 23947db96d56Sopenharmony_ci exec(open(base_py).read(), dir) 23957db96d56Sopenharmony_ci 23967db96d56Sopenharmony_ci def report_callback_exception(self, exc, val, tb): 23977db96d56Sopenharmony_ci """Report callback exception on sys.stderr. 23987db96d56Sopenharmony_ci 23997db96d56Sopenharmony_ci Applications may want to override this internal function, and 24007db96d56Sopenharmony_ci should when sys.stderr is None.""" 24017db96d56Sopenharmony_ci import traceback 24027db96d56Sopenharmony_ci print("Exception in Tkinter callback", file=sys.stderr) 24037db96d56Sopenharmony_ci sys.last_type = exc 24047db96d56Sopenharmony_ci sys.last_value = val 24057db96d56Sopenharmony_ci sys.last_traceback = tb 24067db96d56Sopenharmony_ci traceback.print_exception(exc, val, tb) 24077db96d56Sopenharmony_ci 24087db96d56Sopenharmony_ci def __getattr__(self, attr): 24097db96d56Sopenharmony_ci "Delegate attribute access to the interpreter object" 24107db96d56Sopenharmony_ci return getattr(self.tk, attr) 24117db96d56Sopenharmony_ci 24127db96d56Sopenharmony_ci# Ideally, the classes Pack, Place and Grid disappear, the 24137db96d56Sopenharmony_ci# pack/place/grid methods are defined on the Widget class, and 24147db96d56Sopenharmony_ci# everybody uses w.pack_whatever(...) instead of Pack.whatever(w, 24157db96d56Sopenharmony_ci# ...), with pack(), place() and grid() being short for 24167db96d56Sopenharmony_ci# pack_configure(), place_configure() and grid_columnconfigure(), and 24177db96d56Sopenharmony_ci# forget() being short for pack_forget(). As a practical matter, I'm 24187db96d56Sopenharmony_ci# afraid that there is too much code out there that may be using the 24197db96d56Sopenharmony_ci# Pack, Place or Grid class, so I leave them intact -- but only as 24207db96d56Sopenharmony_ci# backwards compatibility features. Also note that those methods that 24217db96d56Sopenharmony_ci# take a master as argument (e.g. pack_propagate) have been moved to 24227db96d56Sopenharmony_ci# the Misc class (which now incorporates all methods common between 24237db96d56Sopenharmony_ci# toplevel and interior widgets). Again, for compatibility, these are 24247db96d56Sopenharmony_ci# copied into the Pack, Place or Grid class. 24257db96d56Sopenharmony_ci 24267db96d56Sopenharmony_ci 24277db96d56Sopenharmony_cidef Tcl(screenName=None, baseName=None, className='Tk', useTk=False): 24287db96d56Sopenharmony_ci return Tk(screenName, baseName, className, useTk) 24297db96d56Sopenharmony_ci 24307db96d56Sopenharmony_ci 24317db96d56Sopenharmony_ciclass Pack: 24327db96d56Sopenharmony_ci """Geometry manager Pack. 24337db96d56Sopenharmony_ci 24347db96d56Sopenharmony_ci Base class to use the methods pack_* in every widget.""" 24357db96d56Sopenharmony_ci 24367db96d56Sopenharmony_ci def pack_configure(self, cnf={}, **kw): 24377db96d56Sopenharmony_ci """Pack a widget in the parent widget. Use as options: 24387db96d56Sopenharmony_ci after=widget - pack it after you have packed widget 24397db96d56Sopenharmony_ci anchor=NSEW (or subset) - position widget according to 24407db96d56Sopenharmony_ci given direction 24417db96d56Sopenharmony_ci before=widget - pack it before you will pack widget 24427db96d56Sopenharmony_ci expand=bool - expand widget if parent size grows 24437db96d56Sopenharmony_ci fill=NONE or X or Y or BOTH - fill widget if widget grows 24447db96d56Sopenharmony_ci in=master - use master to contain this widget 24457db96d56Sopenharmony_ci in_=master - see 'in' option description 24467db96d56Sopenharmony_ci ipadx=amount - add internal padding in x direction 24477db96d56Sopenharmony_ci ipady=amount - add internal padding in y direction 24487db96d56Sopenharmony_ci padx=amount - add padding in x direction 24497db96d56Sopenharmony_ci pady=amount - add padding in y direction 24507db96d56Sopenharmony_ci side=TOP or BOTTOM or LEFT or RIGHT - where to add this widget. 24517db96d56Sopenharmony_ci """ 24527db96d56Sopenharmony_ci self.tk.call( 24537db96d56Sopenharmony_ci ('pack', 'configure', self._w) 24547db96d56Sopenharmony_ci + self._options(cnf, kw)) 24557db96d56Sopenharmony_ci 24567db96d56Sopenharmony_ci pack = configure = config = pack_configure 24577db96d56Sopenharmony_ci 24587db96d56Sopenharmony_ci def pack_forget(self): 24597db96d56Sopenharmony_ci """Unmap this widget and do not use it for the packing order.""" 24607db96d56Sopenharmony_ci self.tk.call('pack', 'forget', self._w) 24617db96d56Sopenharmony_ci 24627db96d56Sopenharmony_ci forget = pack_forget 24637db96d56Sopenharmony_ci 24647db96d56Sopenharmony_ci def pack_info(self): 24657db96d56Sopenharmony_ci """Return information about the packing options 24667db96d56Sopenharmony_ci for this widget.""" 24677db96d56Sopenharmony_ci d = _splitdict(self.tk, self.tk.call('pack', 'info', self._w)) 24687db96d56Sopenharmony_ci if 'in' in d: 24697db96d56Sopenharmony_ci d['in'] = self.nametowidget(d['in']) 24707db96d56Sopenharmony_ci return d 24717db96d56Sopenharmony_ci 24727db96d56Sopenharmony_ci info = pack_info 24737db96d56Sopenharmony_ci propagate = pack_propagate = Misc.pack_propagate 24747db96d56Sopenharmony_ci slaves = pack_slaves = Misc.pack_slaves 24757db96d56Sopenharmony_ci 24767db96d56Sopenharmony_ci 24777db96d56Sopenharmony_ciclass Place: 24787db96d56Sopenharmony_ci """Geometry manager Place. 24797db96d56Sopenharmony_ci 24807db96d56Sopenharmony_ci Base class to use the methods place_* in every widget.""" 24817db96d56Sopenharmony_ci 24827db96d56Sopenharmony_ci def place_configure(self, cnf={}, **kw): 24837db96d56Sopenharmony_ci """Place a widget in the parent widget. Use as options: 24847db96d56Sopenharmony_ci in=master - master relative to which the widget is placed 24857db96d56Sopenharmony_ci in_=master - see 'in' option description 24867db96d56Sopenharmony_ci x=amount - locate anchor of this widget at position x of master 24877db96d56Sopenharmony_ci y=amount - locate anchor of this widget at position y of master 24887db96d56Sopenharmony_ci relx=amount - locate anchor of this widget between 0.0 and 1.0 24897db96d56Sopenharmony_ci relative to width of master (1.0 is right edge) 24907db96d56Sopenharmony_ci rely=amount - locate anchor of this widget between 0.0 and 1.0 24917db96d56Sopenharmony_ci relative to height of master (1.0 is bottom edge) 24927db96d56Sopenharmony_ci anchor=NSEW (or subset) - position anchor according to given direction 24937db96d56Sopenharmony_ci width=amount - width of this widget in pixel 24947db96d56Sopenharmony_ci height=amount - height of this widget in pixel 24957db96d56Sopenharmony_ci relwidth=amount - width of this widget between 0.0 and 1.0 24967db96d56Sopenharmony_ci relative to width of master (1.0 is the same width 24977db96d56Sopenharmony_ci as the master) 24987db96d56Sopenharmony_ci relheight=amount - height of this widget between 0.0 and 1.0 24997db96d56Sopenharmony_ci relative to height of master (1.0 is the same 25007db96d56Sopenharmony_ci height as the master) 25017db96d56Sopenharmony_ci bordermode="inside" or "outside" - whether to take border width of 25027db96d56Sopenharmony_ci master widget into account 25037db96d56Sopenharmony_ci """ 25047db96d56Sopenharmony_ci self.tk.call( 25057db96d56Sopenharmony_ci ('place', 'configure', self._w) 25067db96d56Sopenharmony_ci + self._options(cnf, kw)) 25077db96d56Sopenharmony_ci 25087db96d56Sopenharmony_ci place = configure = config = place_configure 25097db96d56Sopenharmony_ci 25107db96d56Sopenharmony_ci def place_forget(self): 25117db96d56Sopenharmony_ci """Unmap this widget.""" 25127db96d56Sopenharmony_ci self.tk.call('place', 'forget', self._w) 25137db96d56Sopenharmony_ci 25147db96d56Sopenharmony_ci forget = place_forget 25157db96d56Sopenharmony_ci 25167db96d56Sopenharmony_ci def place_info(self): 25177db96d56Sopenharmony_ci """Return information about the placing options 25187db96d56Sopenharmony_ci for this widget.""" 25197db96d56Sopenharmony_ci d = _splitdict(self.tk, self.tk.call('place', 'info', self._w)) 25207db96d56Sopenharmony_ci if 'in' in d: 25217db96d56Sopenharmony_ci d['in'] = self.nametowidget(d['in']) 25227db96d56Sopenharmony_ci return d 25237db96d56Sopenharmony_ci 25247db96d56Sopenharmony_ci info = place_info 25257db96d56Sopenharmony_ci slaves = place_slaves = Misc.place_slaves 25267db96d56Sopenharmony_ci 25277db96d56Sopenharmony_ci 25287db96d56Sopenharmony_ciclass Grid: 25297db96d56Sopenharmony_ci """Geometry manager Grid. 25307db96d56Sopenharmony_ci 25317db96d56Sopenharmony_ci Base class to use the methods grid_* in every widget.""" 25327db96d56Sopenharmony_ci # Thanks to Masazumi Yoshikawa (yosikawa@isi.edu) 25337db96d56Sopenharmony_ci 25347db96d56Sopenharmony_ci def grid_configure(self, cnf={}, **kw): 25357db96d56Sopenharmony_ci """Position a widget in the parent widget in a grid. Use as options: 25367db96d56Sopenharmony_ci column=number - use cell identified with given column (starting with 0) 25377db96d56Sopenharmony_ci columnspan=number - this widget will span several columns 25387db96d56Sopenharmony_ci in=master - use master to contain this widget 25397db96d56Sopenharmony_ci in_=master - see 'in' option description 25407db96d56Sopenharmony_ci ipadx=amount - add internal padding in x direction 25417db96d56Sopenharmony_ci ipady=amount - add internal padding in y direction 25427db96d56Sopenharmony_ci padx=amount - add padding in x direction 25437db96d56Sopenharmony_ci pady=amount - add padding in y direction 25447db96d56Sopenharmony_ci row=number - use cell identified with given row (starting with 0) 25457db96d56Sopenharmony_ci rowspan=number - this widget will span several rows 25467db96d56Sopenharmony_ci sticky=NSEW - if cell is larger on which sides will this 25477db96d56Sopenharmony_ci widget stick to the cell boundary 25487db96d56Sopenharmony_ci """ 25497db96d56Sopenharmony_ci self.tk.call( 25507db96d56Sopenharmony_ci ('grid', 'configure', self._w) 25517db96d56Sopenharmony_ci + self._options(cnf, kw)) 25527db96d56Sopenharmony_ci 25537db96d56Sopenharmony_ci grid = configure = config = grid_configure 25547db96d56Sopenharmony_ci bbox = grid_bbox = Misc.grid_bbox 25557db96d56Sopenharmony_ci columnconfigure = grid_columnconfigure = Misc.grid_columnconfigure 25567db96d56Sopenharmony_ci 25577db96d56Sopenharmony_ci def grid_forget(self): 25587db96d56Sopenharmony_ci """Unmap this widget.""" 25597db96d56Sopenharmony_ci self.tk.call('grid', 'forget', self._w) 25607db96d56Sopenharmony_ci 25617db96d56Sopenharmony_ci forget = grid_forget 25627db96d56Sopenharmony_ci 25637db96d56Sopenharmony_ci def grid_remove(self): 25647db96d56Sopenharmony_ci """Unmap this widget but remember the grid options.""" 25657db96d56Sopenharmony_ci self.tk.call('grid', 'remove', self._w) 25667db96d56Sopenharmony_ci 25677db96d56Sopenharmony_ci def grid_info(self): 25687db96d56Sopenharmony_ci """Return information about the options 25697db96d56Sopenharmony_ci for positioning this widget in a grid.""" 25707db96d56Sopenharmony_ci d = _splitdict(self.tk, self.tk.call('grid', 'info', self._w)) 25717db96d56Sopenharmony_ci if 'in' in d: 25727db96d56Sopenharmony_ci d['in'] = self.nametowidget(d['in']) 25737db96d56Sopenharmony_ci return d 25747db96d56Sopenharmony_ci 25757db96d56Sopenharmony_ci info = grid_info 25767db96d56Sopenharmony_ci location = grid_location = Misc.grid_location 25777db96d56Sopenharmony_ci propagate = grid_propagate = Misc.grid_propagate 25787db96d56Sopenharmony_ci rowconfigure = grid_rowconfigure = Misc.grid_rowconfigure 25797db96d56Sopenharmony_ci size = grid_size = Misc.grid_size 25807db96d56Sopenharmony_ci slaves = grid_slaves = Misc.grid_slaves 25817db96d56Sopenharmony_ci 25827db96d56Sopenharmony_ci 25837db96d56Sopenharmony_ciclass BaseWidget(Misc): 25847db96d56Sopenharmony_ci """Internal class.""" 25857db96d56Sopenharmony_ci 25867db96d56Sopenharmony_ci def _setup(self, master, cnf): 25877db96d56Sopenharmony_ci """Internal function. Sets up information about children.""" 25887db96d56Sopenharmony_ci if master is None: 25897db96d56Sopenharmony_ci master = _get_default_root() 25907db96d56Sopenharmony_ci self.master = master 25917db96d56Sopenharmony_ci self.tk = master.tk 25927db96d56Sopenharmony_ci name = None 25937db96d56Sopenharmony_ci if 'name' in cnf: 25947db96d56Sopenharmony_ci name = cnf['name'] 25957db96d56Sopenharmony_ci del cnf['name'] 25967db96d56Sopenharmony_ci if not name: 25977db96d56Sopenharmony_ci name = self.__class__.__name__.lower() 25987db96d56Sopenharmony_ci if master._last_child_ids is None: 25997db96d56Sopenharmony_ci master._last_child_ids = {} 26007db96d56Sopenharmony_ci count = master._last_child_ids.get(name, 0) + 1 26017db96d56Sopenharmony_ci master._last_child_ids[name] = count 26027db96d56Sopenharmony_ci if count == 1: 26037db96d56Sopenharmony_ci name = '!%s' % (name,) 26047db96d56Sopenharmony_ci else: 26057db96d56Sopenharmony_ci name = '!%s%d' % (name, count) 26067db96d56Sopenharmony_ci self._name = name 26077db96d56Sopenharmony_ci if master._w=='.': 26087db96d56Sopenharmony_ci self._w = '.' + name 26097db96d56Sopenharmony_ci else: 26107db96d56Sopenharmony_ci self._w = master._w + '.' + name 26117db96d56Sopenharmony_ci self.children = {} 26127db96d56Sopenharmony_ci if self._name in self.master.children: 26137db96d56Sopenharmony_ci self.master.children[self._name].destroy() 26147db96d56Sopenharmony_ci self.master.children[self._name] = self 26157db96d56Sopenharmony_ci 26167db96d56Sopenharmony_ci def __init__(self, master, widgetName, cnf={}, kw={}, extra=()): 26177db96d56Sopenharmony_ci """Construct a widget with the parent widget MASTER, a name WIDGETNAME 26187db96d56Sopenharmony_ci and appropriate options.""" 26197db96d56Sopenharmony_ci if kw: 26207db96d56Sopenharmony_ci cnf = _cnfmerge((cnf, kw)) 26217db96d56Sopenharmony_ci self.widgetName = widgetName 26227db96d56Sopenharmony_ci self._setup(master, cnf) 26237db96d56Sopenharmony_ci if self._tclCommands is None: 26247db96d56Sopenharmony_ci self._tclCommands = [] 26257db96d56Sopenharmony_ci classes = [(k, v) for k, v in cnf.items() if isinstance(k, type)] 26267db96d56Sopenharmony_ci for k, v in classes: 26277db96d56Sopenharmony_ci del cnf[k] 26287db96d56Sopenharmony_ci self.tk.call( 26297db96d56Sopenharmony_ci (widgetName, self._w) + extra + self._options(cnf)) 26307db96d56Sopenharmony_ci for k, v in classes: 26317db96d56Sopenharmony_ci k.configure(self, v) 26327db96d56Sopenharmony_ci 26337db96d56Sopenharmony_ci def destroy(self): 26347db96d56Sopenharmony_ci """Destroy this and all descendants widgets.""" 26357db96d56Sopenharmony_ci for c in list(self.children.values()): c.destroy() 26367db96d56Sopenharmony_ci self.tk.call('destroy', self._w) 26377db96d56Sopenharmony_ci if self._name in self.master.children: 26387db96d56Sopenharmony_ci del self.master.children[self._name] 26397db96d56Sopenharmony_ci Misc.destroy(self) 26407db96d56Sopenharmony_ci 26417db96d56Sopenharmony_ci def _do(self, name, args=()): 26427db96d56Sopenharmony_ci # XXX Obsolete -- better use self.tk.call directly! 26437db96d56Sopenharmony_ci return self.tk.call((self._w, name) + args) 26447db96d56Sopenharmony_ci 26457db96d56Sopenharmony_ci 26467db96d56Sopenharmony_ciclass Widget(BaseWidget, Pack, Place, Grid): 26477db96d56Sopenharmony_ci """Internal class. 26487db96d56Sopenharmony_ci 26497db96d56Sopenharmony_ci Base class for a widget which can be positioned with the geometry managers 26507db96d56Sopenharmony_ci Pack, Place or Grid.""" 26517db96d56Sopenharmony_ci pass 26527db96d56Sopenharmony_ci 26537db96d56Sopenharmony_ci 26547db96d56Sopenharmony_ciclass Toplevel(BaseWidget, Wm): 26557db96d56Sopenharmony_ci """Toplevel widget, e.g. for dialogs.""" 26567db96d56Sopenharmony_ci 26577db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 26587db96d56Sopenharmony_ci """Construct a toplevel widget with the parent MASTER. 26597db96d56Sopenharmony_ci 26607db96d56Sopenharmony_ci Valid resource names: background, bd, bg, borderwidth, class, 26617db96d56Sopenharmony_ci colormap, container, cursor, height, highlightbackground, 26627db96d56Sopenharmony_ci highlightcolor, highlightthickness, menu, relief, screen, takefocus, 26637db96d56Sopenharmony_ci use, visual, width.""" 26647db96d56Sopenharmony_ci if kw: 26657db96d56Sopenharmony_ci cnf = _cnfmerge((cnf, kw)) 26667db96d56Sopenharmony_ci extra = () 26677db96d56Sopenharmony_ci for wmkey in ['screen', 'class_', 'class', 'visual', 26687db96d56Sopenharmony_ci 'colormap']: 26697db96d56Sopenharmony_ci if wmkey in cnf: 26707db96d56Sopenharmony_ci val = cnf[wmkey] 26717db96d56Sopenharmony_ci # TBD: a hack needed because some keys 26727db96d56Sopenharmony_ci # are not valid as keyword arguments 26737db96d56Sopenharmony_ci if wmkey[-1] == '_': opt = '-'+wmkey[:-1] 26747db96d56Sopenharmony_ci else: opt = '-'+wmkey 26757db96d56Sopenharmony_ci extra = extra + (opt, val) 26767db96d56Sopenharmony_ci del cnf[wmkey] 26777db96d56Sopenharmony_ci BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra) 26787db96d56Sopenharmony_ci root = self._root() 26797db96d56Sopenharmony_ci self.iconname(root.iconname()) 26807db96d56Sopenharmony_ci self.title(root.title()) 26817db96d56Sopenharmony_ci self.protocol("WM_DELETE_WINDOW", self.destroy) 26827db96d56Sopenharmony_ci 26837db96d56Sopenharmony_ci 26847db96d56Sopenharmony_ciclass Button(Widget): 26857db96d56Sopenharmony_ci """Button widget.""" 26867db96d56Sopenharmony_ci 26877db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 26887db96d56Sopenharmony_ci """Construct a button widget with the parent MASTER. 26897db96d56Sopenharmony_ci 26907db96d56Sopenharmony_ci STANDARD OPTIONS 26917db96d56Sopenharmony_ci 26927db96d56Sopenharmony_ci activebackground, activeforeground, anchor, 26937db96d56Sopenharmony_ci background, bitmap, borderwidth, cursor, 26947db96d56Sopenharmony_ci disabledforeground, font, foreground 26957db96d56Sopenharmony_ci highlightbackground, highlightcolor, 26967db96d56Sopenharmony_ci highlightthickness, image, justify, 26977db96d56Sopenharmony_ci padx, pady, relief, repeatdelay, 26987db96d56Sopenharmony_ci repeatinterval, takefocus, text, 26997db96d56Sopenharmony_ci textvariable, underline, wraplength 27007db96d56Sopenharmony_ci 27017db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 27027db96d56Sopenharmony_ci 27037db96d56Sopenharmony_ci command, compound, default, height, 27047db96d56Sopenharmony_ci overrelief, state, width 27057db96d56Sopenharmony_ci """ 27067db96d56Sopenharmony_ci Widget.__init__(self, master, 'button', cnf, kw) 27077db96d56Sopenharmony_ci 27087db96d56Sopenharmony_ci def flash(self): 27097db96d56Sopenharmony_ci """Flash the button. 27107db96d56Sopenharmony_ci 27117db96d56Sopenharmony_ci This is accomplished by redisplaying 27127db96d56Sopenharmony_ci the button several times, alternating between active and 27137db96d56Sopenharmony_ci normal colors. At the end of the flash the button is left 27147db96d56Sopenharmony_ci in the same normal/active state as when the command was 27157db96d56Sopenharmony_ci invoked. This command is ignored if the button's state is 27167db96d56Sopenharmony_ci disabled. 27177db96d56Sopenharmony_ci """ 27187db96d56Sopenharmony_ci self.tk.call(self._w, 'flash') 27197db96d56Sopenharmony_ci 27207db96d56Sopenharmony_ci def invoke(self): 27217db96d56Sopenharmony_ci """Invoke the command associated with the button. 27227db96d56Sopenharmony_ci 27237db96d56Sopenharmony_ci The return value is the return value from the command, 27247db96d56Sopenharmony_ci or an empty string if there is no command associated with 27257db96d56Sopenharmony_ci the button. This command is ignored if the button's state 27267db96d56Sopenharmony_ci is disabled. 27277db96d56Sopenharmony_ci """ 27287db96d56Sopenharmony_ci return self.tk.call(self._w, 'invoke') 27297db96d56Sopenharmony_ci 27307db96d56Sopenharmony_ci 27317db96d56Sopenharmony_ciclass Canvas(Widget, XView, YView): 27327db96d56Sopenharmony_ci """Canvas widget to display graphical elements like lines or text.""" 27337db96d56Sopenharmony_ci 27347db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 27357db96d56Sopenharmony_ci """Construct a canvas widget with the parent MASTER. 27367db96d56Sopenharmony_ci 27377db96d56Sopenharmony_ci Valid resource names: background, bd, bg, borderwidth, closeenough, 27387db96d56Sopenharmony_ci confine, cursor, height, highlightbackground, highlightcolor, 27397db96d56Sopenharmony_ci highlightthickness, insertbackground, insertborderwidth, 27407db96d56Sopenharmony_ci insertofftime, insertontime, insertwidth, offset, relief, 27417db96d56Sopenharmony_ci scrollregion, selectbackground, selectborderwidth, selectforeground, 27427db96d56Sopenharmony_ci state, takefocus, width, xscrollcommand, xscrollincrement, 27437db96d56Sopenharmony_ci yscrollcommand, yscrollincrement.""" 27447db96d56Sopenharmony_ci Widget.__init__(self, master, 'canvas', cnf, kw) 27457db96d56Sopenharmony_ci 27467db96d56Sopenharmony_ci def addtag(self, *args): 27477db96d56Sopenharmony_ci """Internal function.""" 27487db96d56Sopenharmony_ci self.tk.call((self._w, 'addtag') + args) 27497db96d56Sopenharmony_ci 27507db96d56Sopenharmony_ci def addtag_above(self, newtag, tagOrId): 27517db96d56Sopenharmony_ci """Add tag NEWTAG to all items above TAGORID.""" 27527db96d56Sopenharmony_ci self.addtag(newtag, 'above', tagOrId) 27537db96d56Sopenharmony_ci 27547db96d56Sopenharmony_ci def addtag_all(self, newtag): 27557db96d56Sopenharmony_ci """Add tag NEWTAG to all items.""" 27567db96d56Sopenharmony_ci self.addtag(newtag, 'all') 27577db96d56Sopenharmony_ci 27587db96d56Sopenharmony_ci def addtag_below(self, newtag, tagOrId): 27597db96d56Sopenharmony_ci """Add tag NEWTAG to all items below TAGORID.""" 27607db96d56Sopenharmony_ci self.addtag(newtag, 'below', tagOrId) 27617db96d56Sopenharmony_ci 27627db96d56Sopenharmony_ci def addtag_closest(self, newtag, x, y, halo=None, start=None): 27637db96d56Sopenharmony_ci """Add tag NEWTAG to item which is closest to pixel at X, Y. 27647db96d56Sopenharmony_ci If several match take the top-most. 27657db96d56Sopenharmony_ci All items closer than HALO are considered overlapping (all are 27667db96d56Sopenharmony_ci closest). If START is specified the next below this tag is taken.""" 27677db96d56Sopenharmony_ci self.addtag(newtag, 'closest', x, y, halo, start) 27687db96d56Sopenharmony_ci 27697db96d56Sopenharmony_ci def addtag_enclosed(self, newtag, x1, y1, x2, y2): 27707db96d56Sopenharmony_ci """Add tag NEWTAG to all items in the rectangle defined 27717db96d56Sopenharmony_ci by X1,Y1,X2,Y2.""" 27727db96d56Sopenharmony_ci self.addtag(newtag, 'enclosed', x1, y1, x2, y2) 27737db96d56Sopenharmony_ci 27747db96d56Sopenharmony_ci def addtag_overlapping(self, newtag, x1, y1, x2, y2): 27757db96d56Sopenharmony_ci """Add tag NEWTAG to all items which overlap the rectangle 27767db96d56Sopenharmony_ci defined by X1,Y1,X2,Y2.""" 27777db96d56Sopenharmony_ci self.addtag(newtag, 'overlapping', x1, y1, x2, y2) 27787db96d56Sopenharmony_ci 27797db96d56Sopenharmony_ci def addtag_withtag(self, newtag, tagOrId): 27807db96d56Sopenharmony_ci """Add tag NEWTAG to all items with TAGORID.""" 27817db96d56Sopenharmony_ci self.addtag(newtag, 'withtag', tagOrId) 27827db96d56Sopenharmony_ci 27837db96d56Sopenharmony_ci def bbox(self, *args): 27847db96d56Sopenharmony_ci """Return a tuple of X1,Y1,X2,Y2 coordinates for a rectangle 27857db96d56Sopenharmony_ci which encloses all items with tags specified as arguments.""" 27867db96d56Sopenharmony_ci return self._getints( 27877db96d56Sopenharmony_ci self.tk.call((self._w, 'bbox') + args)) or None 27887db96d56Sopenharmony_ci 27897db96d56Sopenharmony_ci def tag_unbind(self, tagOrId, sequence, funcid=None): 27907db96d56Sopenharmony_ci """Unbind for all items with TAGORID for event SEQUENCE the 27917db96d56Sopenharmony_ci function identified with FUNCID.""" 27927db96d56Sopenharmony_ci self.tk.call(self._w, 'bind', tagOrId, sequence, '') 27937db96d56Sopenharmony_ci if funcid: 27947db96d56Sopenharmony_ci self.deletecommand(funcid) 27957db96d56Sopenharmony_ci 27967db96d56Sopenharmony_ci def tag_bind(self, tagOrId, sequence=None, func=None, add=None): 27977db96d56Sopenharmony_ci """Bind to all items with TAGORID at event SEQUENCE a call to function FUNC. 27987db96d56Sopenharmony_ci 27997db96d56Sopenharmony_ci An additional boolean parameter ADD specifies whether FUNC will be 28007db96d56Sopenharmony_ci called additionally to the other bound function or whether it will 28017db96d56Sopenharmony_ci replace the previous function. See bind for the return value.""" 28027db96d56Sopenharmony_ci return self._bind((self._w, 'bind', tagOrId), 28037db96d56Sopenharmony_ci sequence, func, add) 28047db96d56Sopenharmony_ci 28057db96d56Sopenharmony_ci def canvasx(self, screenx, gridspacing=None): 28067db96d56Sopenharmony_ci """Return the canvas x coordinate of pixel position SCREENX rounded 28077db96d56Sopenharmony_ci to nearest multiple of GRIDSPACING units.""" 28087db96d56Sopenharmony_ci return self.tk.getdouble(self.tk.call( 28097db96d56Sopenharmony_ci self._w, 'canvasx', screenx, gridspacing)) 28107db96d56Sopenharmony_ci 28117db96d56Sopenharmony_ci def canvasy(self, screeny, gridspacing=None): 28127db96d56Sopenharmony_ci """Return the canvas y coordinate of pixel position SCREENY rounded 28137db96d56Sopenharmony_ci to nearest multiple of GRIDSPACING units.""" 28147db96d56Sopenharmony_ci return self.tk.getdouble(self.tk.call( 28157db96d56Sopenharmony_ci self._w, 'canvasy', screeny, gridspacing)) 28167db96d56Sopenharmony_ci 28177db96d56Sopenharmony_ci def coords(self, *args): 28187db96d56Sopenharmony_ci """Return a list of coordinates for the item given in ARGS.""" 28197db96d56Sopenharmony_ci # XXX Should use _flatten on args 28207db96d56Sopenharmony_ci return [self.tk.getdouble(x) for x in 28217db96d56Sopenharmony_ci self.tk.splitlist( 28227db96d56Sopenharmony_ci self.tk.call((self._w, 'coords') + args))] 28237db96d56Sopenharmony_ci 28247db96d56Sopenharmony_ci def _create(self, itemType, args, kw): # Args: (val, val, ..., cnf={}) 28257db96d56Sopenharmony_ci """Internal function.""" 28267db96d56Sopenharmony_ci args = _flatten(args) 28277db96d56Sopenharmony_ci cnf = args[-1] 28287db96d56Sopenharmony_ci if isinstance(cnf, (dict, tuple)): 28297db96d56Sopenharmony_ci args = args[:-1] 28307db96d56Sopenharmony_ci else: 28317db96d56Sopenharmony_ci cnf = {} 28327db96d56Sopenharmony_ci return self.tk.getint(self.tk.call( 28337db96d56Sopenharmony_ci self._w, 'create', itemType, 28347db96d56Sopenharmony_ci *(args + self._options(cnf, kw)))) 28357db96d56Sopenharmony_ci 28367db96d56Sopenharmony_ci def create_arc(self, *args, **kw): 28377db96d56Sopenharmony_ci """Create arc shaped region with coordinates x1,y1,x2,y2.""" 28387db96d56Sopenharmony_ci return self._create('arc', args, kw) 28397db96d56Sopenharmony_ci 28407db96d56Sopenharmony_ci def create_bitmap(self, *args, **kw): 28417db96d56Sopenharmony_ci """Create bitmap with coordinates x1,y1.""" 28427db96d56Sopenharmony_ci return self._create('bitmap', args, kw) 28437db96d56Sopenharmony_ci 28447db96d56Sopenharmony_ci def create_image(self, *args, **kw): 28457db96d56Sopenharmony_ci """Create image item with coordinates x1,y1.""" 28467db96d56Sopenharmony_ci return self._create('image', args, kw) 28477db96d56Sopenharmony_ci 28487db96d56Sopenharmony_ci def create_line(self, *args, **kw): 28497db96d56Sopenharmony_ci """Create line with coordinates x1,y1,...,xn,yn.""" 28507db96d56Sopenharmony_ci return self._create('line', args, kw) 28517db96d56Sopenharmony_ci 28527db96d56Sopenharmony_ci def create_oval(self, *args, **kw): 28537db96d56Sopenharmony_ci """Create oval with coordinates x1,y1,x2,y2.""" 28547db96d56Sopenharmony_ci return self._create('oval', args, kw) 28557db96d56Sopenharmony_ci 28567db96d56Sopenharmony_ci def create_polygon(self, *args, **kw): 28577db96d56Sopenharmony_ci """Create polygon with coordinates x1,y1,...,xn,yn.""" 28587db96d56Sopenharmony_ci return self._create('polygon', args, kw) 28597db96d56Sopenharmony_ci 28607db96d56Sopenharmony_ci def create_rectangle(self, *args, **kw): 28617db96d56Sopenharmony_ci """Create rectangle with coordinates x1,y1,x2,y2.""" 28627db96d56Sopenharmony_ci return self._create('rectangle', args, kw) 28637db96d56Sopenharmony_ci 28647db96d56Sopenharmony_ci def create_text(self, *args, **kw): 28657db96d56Sopenharmony_ci """Create text with coordinates x1,y1.""" 28667db96d56Sopenharmony_ci return self._create('text', args, kw) 28677db96d56Sopenharmony_ci 28687db96d56Sopenharmony_ci def create_window(self, *args, **kw): 28697db96d56Sopenharmony_ci """Create window with coordinates x1,y1,x2,y2.""" 28707db96d56Sopenharmony_ci return self._create('window', args, kw) 28717db96d56Sopenharmony_ci 28727db96d56Sopenharmony_ci def dchars(self, *args): 28737db96d56Sopenharmony_ci """Delete characters of text items identified by tag or id in ARGS (possibly 28747db96d56Sopenharmony_ci several times) from FIRST to LAST character (including).""" 28757db96d56Sopenharmony_ci self.tk.call((self._w, 'dchars') + args) 28767db96d56Sopenharmony_ci 28777db96d56Sopenharmony_ci def delete(self, *args): 28787db96d56Sopenharmony_ci """Delete items identified by all tag or ids contained in ARGS.""" 28797db96d56Sopenharmony_ci self.tk.call((self._w, 'delete') + args) 28807db96d56Sopenharmony_ci 28817db96d56Sopenharmony_ci def dtag(self, *args): 28827db96d56Sopenharmony_ci """Delete tag or id given as last arguments in ARGS from items 28837db96d56Sopenharmony_ci identified by first argument in ARGS.""" 28847db96d56Sopenharmony_ci self.tk.call((self._w, 'dtag') + args) 28857db96d56Sopenharmony_ci 28867db96d56Sopenharmony_ci def find(self, *args): 28877db96d56Sopenharmony_ci """Internal function.""" 28887db96d56Sopenharmony_ci return self._getints( 28897db96d56Sopenharmony_ci self.tk.call((self._w, 'find') + args)) or () 28907db96d56Sopenharmony_ci 28917db96d56Sopenharmony_ci def find_above(self, tagOrId): 28927db96d56Sopenharmony_ci """Return items above TAGORID.""" 28937db96d56Sopenharmony_ci return self.find('above', tagOrId) 28947db96d56Sopenharmony_ci 28957db96d56Sopenharmony_ci def find_all(self): 28967db96d56Sopenharmony_ci """Return all items.""" 28977db96d56Sopenharmony_ci return self.find('all') 28987db96d56Sopenharmony_ci 28997db96d56Sopenharmony_ci def find_below(self, tagOrId): 29007db96d56Sopenharmony_ci """Return all items below TAGORID.""" 29017db96d56Sopenharmony_ci return self.find('below', tagOrId) 29027db96d56Sopenharmony_ci 29037db96d56Sopenharmony_ci def find_closest(self, x, y, halo=None, start=None): 29047db96d56Sopenharmony_ci """Return item which is closest to pixel at X, Y. 29057db96d56Sopenharmony_ci If several match take the top-most. 29067db96d56Sopenharmony_ci All items closer than HALO are considered overlapping (all are 29077db96d56Sopenharmony_ci closest). If START is specified the next below this tag is taken.""" 29087db96d56Sopenharmony_ci return self.find('closest', x, y, halo, start) 29097db96d56Sopenharmony_ci 29107db96d56Sopenharmony_ci def find_enclosed(self, x1, y1, x2, y2): 29117db96d56Sopenharmony_ci """Return all items in rectangle defined 29127db96d56Sopenharmony_ci by X1,Y1,X2,Y2.""" 29137db96d56Sopenharmony_ci return self.find('enclosed', x1, y1, x2, y2) 29147db96d56Sopenharmony_ci 29157db96d56Sopenharmony_ci def find_overlapping(self, x1, y1, x2, y2): 29167db96d56Sopenharmony_ci """Return all items which overlap the rectangle 29177db96d56Sopenharmony_ci defined by X1,Y1,X2,Y2.""" 29187db96d56Sopenharmony_ci return self.find('overlapping', x1, y1, x2, y2) 29197db96d56Sopenharmony_ci 29207db96d56Sopenharmony_ci def find_withtag(self, tagOrId): 29217db96d56Sopenharmony_ci """Return all items with TAGORID.""" 29227db96d56Sopenharmony_ci return self.find('withtag', tagOrId) 29237db96d56Sopenharmony_ci 29247db96d56Sopenharmony_ci def focus(self, *args): 29257db96d56Sopenharmony_ci """Set focus to the first item specified in ARGS.""" 29267db96d56Sopenharmony_ci return self.tk.call((self._w, 'focus') + args) 29277db96d56Sopenharmony_ci 29287db96d56Sopenharmony_ci def gettags(self, *args): 29297db96d56Sopenharmony_ci """Return tags associated with the first item specified in ARGS.""" 29307db96d56Sopenharmony_ci return self.tk.splitlist( 29317db96d56Sopenharmony_ci self.tk.call((self._w, 'gettags') + args)) 29327db96d56Sopenharmony_ci 29337db96d56Sopenharmony_ci def icursor(self, *args): 29347db96d56Sopenharmony_ci """Set cursor at position POS in the item identified by TAGORID. 29357db96d56Sopenharmony_ci In ARGS TAGORID must be first.""" 29367db96d56Sopenharmony_ci self.tk.call((self._w, 'icursor') + args) 29377db96d56Sopenharmony_ci 29387db96d56Sopenharmony_ci def index(self, *args): 29397db96d56Sopenharmony_ci """Return position of cursor as integer in item specified in ARGS.""" 29407db96d56Sopenharmony_ci return self.tk.getint(self.tk.call((self._w, 'index') + args)) 29417db96d56Sopenharmony_ci 29427db96d56Sopenharmony_ci def insert(self, *args): 29437db96d56Sopenharmony_ci """Insert TEXT in item TAGORID at position POS. ARGS must 29447db96d56Sopenharmony_ci be TAGORID POS TEXT.""" 29457db96d56Sopenharmony_ci self.tk.call((self._w, 'insert') + args) 29467db96d56Sopenharmony_ci 29477db96d56Sopenharmony_ci def itemcget(self, tagOrId, option): 29487db96d56Sopenharmony_ci """Return the resource value for an OPTION for item TAGORID.""" 29497db96d56Sopenharmony_ci return self.tk.call( 29507db96d56Sopenharmony_ci (self._w, 'itemcget') + (tagOrId, '-'+option)) 29517db96d56Sopenharmony_ci 29527db96d56Sopenharmony_ci def itemconfigure(self, tagOrId, cnf=None, **kw): 29537db96d56Sopenharmony_ci """Configure resources of an item TAGORID. 29547db96d56Sopenharmony_ci 29557db96d56Sopenharmony_ci The values for resources are specified as keyword 29567db96d56Sopenharmony_ci arguments. To get an overview about 29577db96d56Sopenharmony_ci the allowed keyword arguments call the method without arguments. 29587db96d56Sopenharmony_ci """ 29597db96d56Sopenharmony_ci return self._configure(('itemconfigure', tagOrId), cnf, kw) 29607db96d56Sopenharmony_ci 29617db96d56Sopenharmony_ci itemconfig = itemconfigure 29627db96d56Sopenharmony_ci 29637db96d56Sopenharmony_ci # lower, tkraise/lift hide Misc.lower, Misc.tkraise/lift, 29647db96d56Sopenharmony_ci # so the preferred name for them is tag_lower, tag_raise 29657db96d56Sopenharmony_ci # (similar to tag_bind, and similar to the Text widget); 29667db96d56Sopenharmony_ci # unfortunately can't delete the old ones yet (maybe in 1.6) 29677db96d56Sopenharmony_ci def tag_lower(self, *args): 29687db96d56Sopenharmony_ci """Lower an item TAGORID given in ARGS 29697db96d56Sopenharmony_ci (optional below another item).""" 29707db96d56Sopenharmony_ci self.tk.call((self._w, 'lower') + args) 29717db96d56Sopenharmony_ci 29727db96d56Sopenharmony_ci lower = tag_lower 29737db96d56Sopenharmony_ci 29747db96d56Sopenharmony_ci def move(self, *args): 29757db96d56Sopenharmony_ci """Move an item TAGORID given in ARGS.""" 29767db96d56Sopenharmony_ci self.tk.call((self._w, 'move') + args) 29777db96d56Sopenharmony_ci 29787db96d56Sopenharmony_ci def moveto(self, tagOrId, x='', y=''): 29797db96d56Sopenharmony_ci """Move the items given by TAGORID in the canvas coordinate 29807db96d56Sopenharmony_ci space so that the first coordinate pair of the bottommost 29817db96d56Sopenharmony_ci item with tag TAGORID is located at position (X,Y). 29827db96d56Sopenharmony_ci X and Y may be the empty string, in which case the 29837db96d56Sopenharmony_ci corresponding coordinate will be unchanged. All items matching 29847db96d56Sopenharmony_ci TAGORID remain in the same positions relative to each other.""" 29857db96d56Sopenharmony_ci self.tk.call(self._w, 'moveto', tagOrId, x, y) 29867db96d56Sopenharmony_ci 29877db96d56Sopenharmony_ci def postscript(self, cnf={}, **kw): 29887db96d56Sopenharmony_ci """Print the contents of the canvas to a postscript 29897db96d56Sopenharmony_ci file. Valid options: colormap, colormode, file, fontmap, 29907db96d56Sopenharmony_ci height, pageanchor, pageheight, pagewidth, pagex, pagey, 29917db96d56Sopenharmony_ci rotate, width, x, y.""" 29927db96d56Sopenharmony_ci return self.tk.call((self._w, 'postscript') + 29937db96d56Sopenharmony_ci self._options(cnf, kw)) 29947db96d56Sopenharmony_ci 29957db96d56Sopenharmony_ci def tag_raise(self, *args): 29967db96d56Sopenharmony_ci """Raise an item TAGORID given in ARGS 29977db96d56Sopenharmony_ci (optional above another item).""" 29987db96d56Sopenharmony_ci self.tk.call((self._w, 'raise') + args) 29997db96d56Sopenharmony_ci 30007db96d56Sopenharmony_ci lift = tkraise = tag_raise 30017db96d56Sopenharmony_ci 30027db96d56Sopenharmony_ci def scale(self, *args): 30037db96d56Sopenharmony_ci """Scale item TAGORID with XORIGIN, YORIGIN, XSCALE, YSCALE.""" 30047db96d56Sopenharmony_ci self.tk.call((self._w, 'scale') + args) 30057db96d56Sopenharmony_ci 30067db96d56Sopenharmony_ci def scan_mark(self, x, y): 30077db96d56Sopenharmony_ci """Remember the current X, Y coordinates.""" 30087db96d56Sopenharmony_ci self.tk.call(self._w, 'scan', 'mark', x, y) 30097db96d56Sopenharmony_ci 30107db96d56Sopenharmony_ci def scan_dragto(self, x, y, gain=10): 30117db96d56Sopenharmony_ci """Adjust the view of the canvas to GAIN times the 30127db96d56Sopenharmony_ci difference between X and Y and the coordinates given in 30137db96d56Sopenharmony_ci scan_mark.""" 30147db96d56Sopenharmony_ci self.tk.call(self._w, 'scan', 'dragto', x, y, gain) 30157db96d56Sopenharmony_ci 30167db96d56Sopenharmony_ci def select_adjust(self, tagOrId, index): 30177db96d56Sopenharmony_ci """Adjust the end of the selection near the cursor of an item TAGORID to index.""" 30187db96d56Sopenharmony_ci self.tk.call(self._w, 'select', 'adjust', tagOrId, index) 30197db96d56Sopenharmony_ci 30207db96d56Sopenharmony_ci def select_clear(self): 30217db96d56Sopenharmony_ci """Clear the selection if it is in this widget.""" 30227db96d56Sopenharmony_ci self.tk.call(self._w, 'select', 'clear') 30237db96d56Sopenharmony_ci 30247db96d56Sopenharmony_ci def select_from(self, tagOrId, index): 30257db96d56Sopenharmony_ci """Set the fixed end of a selection in item TAGORID to INDEX.""" 30267db96d56Sopenharmony_ci self.tk.call(self._w, 'select', 'from', tagOrId, index) 30277db96d56Sopenharmony_ci 30287db96d56Sopenharmony_ci def select_item(self): 30297db96d56Sopenharmony_ci """Return the item which has the selection.""" 30307db96d56Sopenharmony_ci return self.tk.call(self._w, 'select', 'item') or None 30317db96d56Sopenharmony_ci 30327db96d56Sopenharmony_ci def select_to(self, tagOrId, index): 30337db96d56Sopenharmony_ci """Set the variable end of a selection in item TAGORID to INDEX.""" 30347db96d56Sopenharmony_ci self.tk.call(self._w, 'select', 'to', tagOrId, index) 30357db96d56Sopenharmony_ci 30367db96d56Sopenharmony_ci def type(self, tagOrId): 30377db96d56Sopenharmony_ci """Return the type of the item TAGORID.""" 30387db96d56Sopenharmony_ci return self.tk.call(self._w, 'type', tagOrId) or None 30397db96d56Sopenharmony_ci 30407db96d56Sopenharmony_ci 30417db96d56Sopenharmony_ci_checkbutton_count = 0 30427db96d56Sopenharmony_ci 30437db96d56Sopenharmony_ciclass Checkbutton(Widget): 30447db96d56Sopenharmony_ci """Checkbutton widget which is either in on- or off-state.""" 30457db96d56Sopenharmony_ci 30467db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 30477db96d56Sopenharmony_ci """Construct a checkbutton widget with the parent MASTER. 30487db96d56Sopenharmony_ci 30497db96d56Sopenharmony_ci Valid resource names: activebackground, activeforeground, anchor, 30507db96d56Sopenharmony_ci background, bd, bg, bitmap, borderwidth, command, cursor, 30517db96d56Sopenharmony_ci disabledforeground, fg, font, foreground, height, 30527db96d56Sopenharmony_ci highlightbackground, highlightcolor, highlightthickness, image, 30537db96d56Sopenharmony_ci indicatoron, justify, offvalue, onvalue, padx, pady, relief, 30547db96d56Sopenharmony_ci selectcolor, selectimage, state, takefocus, text, textvariable, 30557db96d56Sopenharmony_ci underline, variable, width, wraplength.""" 30567db96d56Sopenharmony_ci Widget.__init__(self, master, 'checkbutton', cnf, kw) 30577db96d56Sopenharmony_ci 30587db96d56Sopenharmony_ci def _setup(self, master, cnf): 30597db96d56Sopenharmony_ci if not cnf.get('name'): 30607db96d56Sopenharmony_ci global _checkbutton_count 30617db96d56Sopenharmony_ci name = self.__class__.__name__.lower() 30627db96d56Sopenharmony_ci _checkbutton_count += 1 30637db96d56Sopenharmony_ci cnf['name'] = f'!{name}{_checkbutton_count}' 30647db96d56Sopenharmony_ci super()._setup(master, cnf) 30657db96d56Sopenharmony_ci 30667db96d56Sopenharmony_ci def deselect(self): 30677db96d56Sopenharmony_ci """Put the button in off-state.""" 30687db96d56Sopenharmony_ci self.tk.call(self._w, 'deselect') 30697db96d56Sopenharmony_ci 30707db96d56Sopenharmony_ci def flash(self): 30717db96d56Sopenharmony_ci """Flash the button.""" 30727db96d56Sopenharmony_ci self.tk.call(self._w, 'flash') 30737db96d56Sopenharmony_ci 30747db96d56Sopenharmony_ci def invoke(self): 30757db96d56Sopenharmony_ci """Toggle the button and invoke a command if given as resource.""" 30767db96d56Sopenharmony_ci return self.tk.call(self._w, 'invoke') 30777db96d56Sopenharmony_ci 30787db96d56Sopenharmony_ci def select(self): 30797db96d56Sopenharmony_ci """Put the button in on-state.""" 30807db96d56Sopenharmony_ci self.tk.call(self._w, 'select') 30817db96d56Sopenharmony_ci 30827db96d56Sopenharmony_ci def toggle(self): 30837db96d56Sopenharmony_ci """Toggle the button.""" 30847db96d56Sopenharmony_ci self.tk.call(self._w, 'toggle') 30857db96d56Sopenharmony_ci 30867db96d56Sopenharmony_ci 30877db96d56Sopenharmony_ciclass Entry(Widget, XView): 30887db96d56Sopenharmony_ci """Entry widget which allows displaying simple text.""" 30897db96d56Sopenharmony_ci 30907db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 30917db96d56Sopenharmony_ci """Construct an entry widget with the parent MASTER. 30927db96d56Sopenharmony_ci 30937db96d56Sopenharmony_ci Valid resource names: background, bd, bg, borderwidth, cursor, 30947db96d56Sopenharmony_ci exportselection, fg, font, foreground, highlightbackground, 30957db96d56Sopenharmony_ci highlightcolor, highlightthickness, insertbackground, 30967db96d56Sopenharmony_ci insertborderwidth, insertofftime, insertontime, insertwidth, 30977db96d56Sopenharmony_ci invalidcommand, invcmd, justify, relief, selectbackground, 30987db96d56Sopenharmony_ci selectborderwidth, selectforeground, show, state, takefocus, 30997db96d56Sopenharmony_ci textvariable, validate, validatecommand, vcmd, width, 31007db96d56Sopenharmony_ci xscrollcommand.""" 31017db96d56Sopenharmony_ci Widget.__init__(self, master, 'entry', cnf, kw) 31027db96d56Sopenharmony_ci 31037db96d56Sopenharmony_ci def delete(self, first, last=None): 31047db96d56Sopenharmony_ci """Delete text from FIRST to LAST (not included).""" 31057db96d56Sopenharmony_ci self.tk.call(self._w, 'delete', first, last) 31067db96d56Sopenharmony_ci 31077db96d56Sopenharmony_ci def get(self): 31087db96d56Sopenharmony_ci """Return the text.""" 31097db96d56Sopenharmony_ci return self.tk.call(self._w, 'get') 31107db96d56Sopenharmony_ci 31117db96d56Sopenharmony_ci def icursor(self, index): 31127db96d56Sopenharmony_ci """Insert cursor at INDEX.""" 31137db96d56Sopenharmony_ci self.tk.call(self._w, 'icursor', index) 31147db96d56Sopenharmony_ci 31157db96d56Sopenharmony_ci def index(self, index): 31167db96d56Sopenharmony_ci """Return position of cursor.""" 31177db96d56Sopenharmony_ci return self.tk.getint(self.tk.call( 31187db96d56Sopenharmony_ci self._w, 'index', index)) 31197db96d56Sopenharmony_ci 31207db96d56Sopenharmony_ci def insert(self, index, string): 31217db96d56Sopenharmony_ci """Insert STRING at INDEX.""" 31227db96d56Sopenharmony_ci self.tk.call(self._w, 'insert', index, string) 31237db96d56Sopenharmony_ci 31247db96d56Sopenharmony_ci def scan_mark(self, x): 31257db96d56Sopenharmony_ci """Remember the current X, Y coordinates.""" 31267db96d56Sopenharmony_ci self.tk.call(self._w, 'scan', 'mark', x) 31277db96d56Sopenharmony_ci 31287db96d56Sopenharmony_ci def scan_dragto(self, x): 31297db96d56Sopenharmony_ci """Adjust the view of the canvas to 10 times the 31307db96d56Sopenharmony_ci difference between X and Y and the coordinates given in 31317db96d56Sopenharmony_ci scan_mark.""" 31327db96d56Sopenharmony_ci self.tk.call(self._w, 'scan', 'dragto', x) 31337db96d56Sopenharmony_ci 31347db96d56Sopenharmony_ci def selection_adjust(self, index): 31357db96d56Sopenharmony_ci """Adjust the end of the selection near the cursor to INDEX.""" 31367db96d56Sopenharmony_ci self.tk.call(self._w, 'selection', 'adjust', index) 31377db96d56Sopenharmony_ci 31387db96d56Sopenharmony_ci select_adjust = selection_adjust 31397db96d56Sopenharmony_ci 31407db96d56Sopenharmony_ci def selection_clear(self): 31417db96d56Sopenharmony_ci """Clear the selection if it is in this widget.""" 31427db96d56Sopenharmony_ci self.tk.call(self._w, 'selection', 'clear') 31437db96d56Sopenharmony_ci 31447db96d56Sopenharmony_ci select_clear = selection_clear 31457db96d56Sopenharmony_ci 31467db96d56Sopenharmony_ci def selection_from(self, index): 31477db96d56Sopenharmony_ci """Set the fixed end of a selection to INDEX.""" 31487db96d56Sopenharmony_ci self.tk.call(self._w, 'selection', 'from', index) 31497db96d56Sopenharmony_ci 31507db96d56Sopenharmony_ci select_from = selection_from 31517db96d56Sopenharmony_ci 31527db96d56Sopenharmony_ci def selection_present(self): 31537db96d56Sopenharmony_ci """Return True if there are characters selected in the entry, False 31547db96d56Sopenharmony_ci otherwise.""" 31557db96d56Sopenharmony_ci return self.tk.getboolean( 31567db96d56Sopenharmony_ci self.tk.call(self._w, 'selection', 'present')) 31577db96d56Sopenharmony_ci 31587db96d56Sopenharmony_ci select_present = selection_present 31597db96d56Sopenharmony_ci 31607db96d56Sopenharmony_ci def selection_range(self, start, end): 31617db96d56Sopenharmony_ci """Set the selection from START to END (not included).""" 31627db96d56Sopenharmony_ci self.tk.call(self._w, 'selection', 'range', start, end) 31637db96d56Sopenharmony_ci 31647db96d56Sopenharmony_ci select_range = selection_range 31657db96d56Sopenharmony_ci 31667db96d56Sopenharmony_ci def selection_to(self, index): 31677db96d56Sopenharmony_ci """Set the variable end of a selection to INDEX.""" 31687db96d56Sopenharmony_ci self.tk.call(self._w, 'selection', 'to', index) 31697db96d56Sopenharmony_ci 31707db96d56Sopenharmony_ci select_to = selection_to 31717db96d56Sopenharmony_ci 31727db96d56Sopenharmony_ci 31737db96d56Sopenharmony_ciclass Frame(Widget): 31747db96d56Sopenharmony_ci """Frame widget which may contain other widgets and can have a 3D border.""" 31757db96d56Sopenharmony_ci 31767db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 31777db96d56Sopenharmony_ci """Construct a frame widget with the parent MASTER. 31787db96d56Sopenharmony_ci 31797db96d56Sopenharmony_ci Valid resource names: background, bd, bg, borderwidth, class, 31807db96d56Sopenharmony_ci colormap, container, cursor, height, highlightbackground, 31817db96d56Sopenharmony_ci highlightcolor, highlightthickness, relief, takefocus, visual, width.""" 31827db96d56Sopenharmony_ci cnf = _cnfmerge((cnf, kw)) 31837db96d56Sopenharmony_ci extra = () 31847db96d56Sopenharmony_ci if 'class_' in cnf: 31857db96d56Sopenharmony_ci extra = ('-class', cnf['class_']) 31867db96d56Sopenharmony_ci del cnf['class_'] 31877db96d56Sopenharmony_ci elif 'class' in cnf: 31887db96d56Sopenharmony_ci extra = ('-class', cnf['class']) 31897db96d56Sopenharmony_ci del cnf['class'] 31907db96d56Sopenharmony_ci Widget.__init__(self, master, 'frame', cnf, {}, extra) 31917db96d56Sopenharmony_ci 31927db96d56Sopenharmony_ci 31937db96d56Sopenharmony_ciclass Label(Widget): 31947db96d56Sopenharmony_ci """Label widget which can display text and bitmaps.""" 31957db96d56Sopenharmony_ci 31967db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 31977db96d56Sopenharmony_ci """Construct a label widget with the parent MASTER. 31987db96d56Sopenharmony_ci 31997db96d56Sopenharmony_ci STANDARD OPTIONS 32007db96d56Sopenharmony_ci 32017db96d56Sopenharmony_ci activebackground, activeforeground, anchor, 32027db96d56Sopenharmony_ci background, bitmap, borderwidth, cursor, 32037db96d56Sopenharmony_ci disabledforeground, font, foreground, 32047db96d56Sopenharmony_ci highlightbackground, highlightcolor, 32057db96d56Sopenharmony_ci highlightthickness, image, justify, 32067db96d56Sopenharmony_ci padx, pady, relief, takefocus, text, 32077db96d56Sopenharmony_ci textvariable, underline, wraplength 32087db96d56Sopenharmony_ci 32097db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 32107db96d56Sopenharmony_ci 32117db96d56Sopenharmony_ci height, state, width 32127db96d56Sopenharmony_ci 32137db96d56Sopenharmony_ci """ 32147db96d56Sopenharmony_ci Widget.__init__(self, master, 'label', cnf, kw) 32157db96d56Sopenharmony_ci 32167db96d56Sopenharmony_ci 32177db96d56Sopenharmony_ciclass Listbox(Widget, XView, YView): 32187db96d56Sopenharmony_ci """Listbox widget which can display a list of strings.""" 32197db96d56Sopenharmony_ci 32207db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 32217db96d56Sopenharmony_ci """Construct a listbox widget with the parent MASTER. 32227db96d56Sopenharmony_ci 32237db96d56Sopenharmony_ci Valid resource names: background, bd, bg, borderwidth, cursor, 32247db96d56Sopenharmony_ci exportselection, fg, font, foreground, height, highlightbackground, 32257db96d56Sopenharmony_ci highlightcolor, highlightthickness, relief, selectbackground, 32267db96d56Sopenharmony_ci selectborderwidth, selectforeground, selectmode, setgrid, takefocus, 32277db96d56Sopenharmony_ci width, xscrollcommand, yscrollcommand, listvariable.""" 32287db96d56Sopenharmony_ci Widget.__init__(self, master, 'listbox', cnf, kw) 32297db96d56Sopenharmony_ci 32307db96d56Sopenharmony_ci def activate(self, index): 32317db96d56Sopenharmony_ci """Activate item identified by INDEX.""" 32327db96d56Sopenharmony_ci self.tk.call(self._w, 'activate', index) 32337db96d56Sopenharmony_ci 32347db96d56Sopenharmony_ci def bbox(self, index): 32357db96d56Sopenharmony_ci """Return a tuple of X1,Y1,X2,Y2 coordinates for a rectangle 32367db96d56Sopenharmony_ci which encloses the item identified by the given index.""" 32377db96d56Sopenharmony_ci return self._getints(self.tk.call(self._w, 'bbox', index)) or None 32387db96d56Sopenharmony_ci 32397db96d56Sopenharmony_ci def curselection(self): 32407db96d56Sopenharmony_ci """Return the indices of currently selected item.""" 32417db96d56Sopenharmony_ci return self._getints(self.tk.call(self._w, 'curselection')) or () 32427db96d56Sopenharmony_ci 32437db96d56Sopenharmony_ci def delete(self, first, last=None): 32447db96d56Sopenharmony_ci """Delete items from FIRST to LAST (included).""" 32457db96d56Sopenharmony_ci self.tk.call(self._w, 'delete', first, last) 32467db96d56Sopenharmony_ci 32477db96d56Sopenharmony_ci def get(self, first, last=None): 32487db96d56Sopenharmony_ci """Get list of items from FIRST to LAST (included).""" 32497db96d56Sopenharmony_ci if last is not None: 32507db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call( 32517db96d56Sopenharmony_ci self._w, 'get', first, last)) 32527db96d56Sopenharmony_ci else: 32537db96d56Sopenharmony_ci return self.tk.call(self._w, 'get', first) 32547db96d56Sopenharmony_ci 32557db96d56Sopenharmony_ci def index(self, index): 32567db96d56Sopenharmony_ci """Return index of item identified with INDEX.""" 32577db96d56Sopenharmony_ci i = self.tk.call(self._w, 'index', index) 32587db96d56Sopenharmony_ci if i == 'none': return None 32597db96d56Sopenharmony_ci return self.tk.getint(i) 32607db96d56Sopenharmony_ci 32617db96d56Sopenharmony_ci def insert(self, index, *elements): 32627db96d56Sopenharmony_ci """Insert ELEMENTS at INDEX.""" 32637db96d56Sopenharmony_ci self.tk.call((self._w, 'insert', index) + elements) 32647db96d56Sopenharmony_ci 32657db96d56Sopenharmony_ci def nearest(self, y): 32667db96d56Sopenharmony_ci """Get index of item which is nearest to y coordinate Y.""" 32677db96d56Sopenharmony_ci return self.tk.getint(self.tk.call( 32687db96d56Sopenharmony_ci self._w, 'nearest', y)) 32697db96d56Sopenharmony_ci 32707db96d56Sopenharmony_ci def scan_mark(self, x, y): 32717db96d56Sopenharmony_ci """Remember the current X, Y coordinates.""" 32727db96d56Sopenharmony_ci self.tk.call(self._w, 'scan', 'mark', x, y) 32737db96d56Sopenharmony_ci 32747db96d56Sopenharmony_ci def scan_dragto(self, x, y): 32757db96d56Sopenharmony_ci """Adjust the view of the listbox to 10 times the 32767db96d56Sopenharmony_ci difference between X and Y and the coordinates given in 32777db96d56Sopenharmony_ci scan_mark.""" 32787db96d56Sopenharmony_ci self.tk.call(self._w, 'scan', 'dragto', x, y) 32797db96d56Sopenharmony_ci 32807db96d56Sopenharmony_ci def see(self, index): 32817db96d56Sopenharmony_ci """Scroll such that INDEX is visible.""" 32827db96d56Sopenharmony_ci self.tk.call(self._w, 'see', index) 32837db96d56Sopenharmony_ci 32847db96d56Sopenharmony_ci def selection_anchor(self, index): 32857db96d56Sopenharmony_ci """Set the fixed end oft the selection to INDEX.""" 32867db96d56Sopenharmony_ci self.tk.call(self._w, 'selection', 'anchor', index) 32877db96d56Sopenharmony_ci 32887db96d56Sopenharmony_ci select_anchor = selection_anchor 32897db96d56Sopenharmony_ci 32907db96d56Sopenharmony_ci def selection_clear(self, first, last=None): 32917db96d56Sopenharmony_ci """Clear the selection from FIRST to LAST (included).""" 32927db96d56Sopenharmony_ci self.tk.call(self._w, 32937db96d56Sopenharmony_ci 'selection', 'clear', first, last) 32947db96d56Sopenharmony_ci 32957db96d56Sopenharmony_ci select_clear = selection_clear 32967db96d56Sopenharmony_ci 32977db96d56Sopenharmony_ci def selection_includes(self, index): 32987db96d56Sopenharmony_ci """Return True if INDEX is part of the selection.""" 32997db96d56Sopenharmony_ci return self.tk.getboolean(self.tk.call( 33007db96d56Sopenharmony_ci self._w, 'selection', 'includes', index)) 33017db96d56Sopenharmony_ci 33027db96d56Sopenharmony_ci select_includes = selection_includes 33037db96d56Sopenharmony_ci 33047db96d56Sopenharmony_ci def selection_set(self, first, last=None): 33057db96d56Sopenharmony_ci """Set the selection from FIRST to LAST (included) without 33067db96d56Sopenharmony_ci changing the currently selected elements.""" 33077db96d56Sopenharmony_ci self.tk.call(self._w, 'selection', 'set', first, last) 33087db96d56Sopenharmony_ci 33097db96d56Sopenharmony_ci select_set = selection_set 33107db96d56Sopenharmony_ci 33117db96d56Sopenharmony_ci def size(self): 33127db96d56Sopenharmony_ci """Return the number of elements in the listbox.""" 33137db96d56Sopenharmony_ci return self.tk.getint(self.tk.call(self._w, 'size')) 33147db96d56Sopenharmony_ci 33157db96d56Sopenharmony_ci def itemcget(self, index, option): 33167db96d56Sopenharmony_ci """Return the resource value for an ITEM and an OPTION.""" 33177db96d56Sopenharmony_ci return self.tk.call( 33187db96d56Sopenharmony_ci (self._w, 'itemcget') + (index, '-'+option)) 33197db96d56Sopenharmony_ci 33207db96d56Sopenharmony_ci def itemconfigure(self, index, cnf=None, **kw): 33217db96d56Sopenharmony_ci """Configure resources of an ITEM. 33227db96d56Sopenharmony_ci 33237db96d56Sopenharmony_ci The values for resources are specified as keyword arguments. 33247db96d56Sopenharmony_ci To get an overview about the allowed keyword arguments 33257db96d56Sopenharmony_ci call the method without arguments. 33267db96d56Sopenharmony_ci Valid resource names: background, bg, foreground, fg, 33277db96d56Sopenharmony_ci selectbackground, selectforeground.""" 33287db96d56Sopenharmony_ci return self._configure(('itemconfigure', index), cnf, kw) 33297db96d56Sopenharmony_ci 33307db96d56Sopenharmony_ci itemconfig = itemconfigure 33317db96d56Sopenharmony_ci 33327db96d56Sopenharmony_ci 33337db96d56Sopenharmony_ciclass Menu(Widget): 33347db96d56Sopenharmony_ci """Menu widget which allows displaying menu bars, pull-down menus and pop-up menus.""" 33357db96d56Sopenharmony_ci 33367db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 33377db96d56Sopenharmony_ci """Construct menu widget with the parent MASTER. 33387db96d56Sopenharmony_ci 33397db96d56Sopenharmony_ci Valid resource names: activebackground, activeborderwidth, 33407db96d56Sopenharmony_ci activeforeground, background, bd, bg, borderwidth, cursor, 33417db96d56Sopenharmony_ci disabledforeground, fg, font, foreground, postcommand, relief, 33427db96d56Sopenharmony_ci selectcolor, takefocus, tearoff, tearoffcommand, title, type.""" 33437db96d56Sopenharmony_ci Widget.__init__(self, master, 'menu', cnf, kw) 33447db96d56Sopenharmony_ci 33457db96d56Sopenharmony_ci def tk_popup(self, x, y, entry=""): 33467db96d56Sopenharmony_ci """Post the menu at position X,Y with entry ENTRY.""" 33477db96d56Sopenharmony_ci self.tk.call('tk_popup', self._w, x, y, entry) 33487db96d56Sopenharmony_ci 33497db96d56Sopenharmony_ci def activate(self, index): 33507db96d56Sopenharmony_ci """Activate entry at INDEX.""" 33517db96d56Sopenharmony_ci self.tk.call(self._w, 'activate', index) 33527db96d56Sopenharmony_ci 33537db96d56Sopenharmony_ci def add(self, itemType, cnf={}, **kw): 33547db96d56Sopenharmony_ci """Internal function.""" 33557db96d56Sopenharmony_ci self.tk.call((self._w, 'add', itemType) + 33567db96d56Sopenharmony_ci self._options(cnf, kw)) 33577db96d56Sopenharmony_ci 33587db96d56Sopenharmony_ci def add_cascade(self, cnf={}, **kw): 33597db96d56Sopenharmony_ci """Add hierarchical menu item.""" 33607db96d56Sopenharmony_ci self.add('cascade', cnf or kw) 33617db96d56Sopenharmony_ci 33627db96d56Sopenharmony_ci def add_checkbutton(self, cnf={}, **kw): 33637db96d56Sopenharmony_ci """Add checkbutton menu item.""" 33647db96d56Sopenharmony_ci self.add('checkbutton', cnf or kw) 33657db96d56Sopenharmony_ci 33667db96d56Sopenharmony_ci def add_command(self, cnf={}, **kw): 33677db96d56Sopenharmony_ci """Add command menu item.""" 33687db96d56Sopenharmony_ci self.add('command', cnf or kw) 33697db96d56Sopenharmony_ci 33707db96d56Sopenharmony_ci def add_radiobutton(self, cnf={}, **kw): 33717db96d56Sopenharmony_ci """Add radio menu item.""" 33727db96d56Sopenharmony_ci self.add('radiobutton', cnf or kw) 33737db96d56Sopenharmony_ci 33747db96d56Sopenharmony_ci def add_separator(self, cnf={}, **kw): 33757db96d56Sopenharmony_ci """Add separator.""" 33767db96d56Sopenharmony_ci self.add('separator', cnf or kw) 33777db96d56Sopenharmony_ci 33787db96d56Sopenharmony_ci def insert(self, index, itemType, cnf={}, **kw): 33797db96d56Sopenharmony_ci """Internal function.""" 33807db96d56Sopenharmony_ci self.tk.call((self._w, 'insert', index, itemType) + 33817db96d56Sopenharmony_ci self._options(cnf, kw)) 33827db96d56Sopenharmony_ci 33837db96d56Sopenharmony_ci def insert_cascade(self, index, cnf={}, **kw): 33847db96d56Sopenharmony_ci """Add hierarchical menu item at INDEX.""" 33857db96d56Sopenharmony_ci self.insert(index, 'cascade', cnf or kw) 33867db96d56Sopenharmony_ci 33877db96d56Sopenharmony_ci def insert_checkbutton(self, index, cnf={}, **kw): 33887db96d56Sopenharmony_ci """Add checkbutton menu item at INDEX.""" 33897db96d56Sopenharmony_ci self.insert(index, 'checkbutton', cnf or kw) 33907db96d56Sopenharmony_ci 33917db96d56Sopenharmony_ci def insert_command(self, index, cnf={}, **kw): 33927db96d56Sopenharmony_ci """Add command menu item at INDEX.""" 33937db96d56Sopenharmony_ci self.insert(index, 'command', cnf or kw) 33947db96d56Sopenharmony_ci 33957db96d56Sopenharmony_ci def insert_radiobutton(self, index, cnf={}, **kw): 33967db96d56Sopenharmony_ci """Add radio menu item at INDEX.""" 33977db96d56Sopenharmony_ci self.insert(index, 'radiobutton', cnf or kw) 33987db96d56Sopenharmony_ci 33997db96d56Sopenharmony_ci def insert_separator(self, index, cnf={}, **kw): 34007db96d56Sopenharmony_ci """Add separator at INDEX.""" 34017db96d56Sopenharmony_ci self.insert(index, 'separator', cnf or kw) 34027db96d56Sopenharmony_ci 34037db96d56Sopenharmony_ci def delete(self, index1, index2=None): 34047db96d56Sopenharmony_ci """Delete menu items between INDEX1 and INDEX2 (included).""" 34057db96d56Sopenharmony_ci if index2 is None: 34067db96d56Sopenharmony_ci index2 = index1 34077db96d56Sopenharmony_ci 34087db96d56Sopenharmony_ci num_index1, num_index2 = self.index(index1), self.index(index2) 34097db96d56Sopenharmony_ci if (num_index1 is None) or (num_index2 is None): 34107db96d56Sopenharmony_ci num_index1, num_index2 = 0, -1 34117db96d56Sopenharmony_ci 34127db96d56Sopenharmony_ci for i in range(num_index1, num_index2 + 1): 34137db96d56Sopenharmony_ci if 'command' in self.entryconfig(i): 34147db96d56Sopenharmony_ci c = str(self.entrycget(i, 'command')) 34157db96d56Sopenharmony_ci if c: 34167db96d56Sopenharmony_ci self.deletecommand(c) 34177db96d56Sopenharmony_ci self.tk.call(self._w, 'delete', index1, index2) 34187db96d56Sopenharmony_ci 34197db96d56Sopenharmony_ci def entrycget(self, index, option): 34207db96d56Sopenharmony_ci """Return the resource value of a menu item for OPTION at INDEX.""" 34217db96d56Sopenharmony_ci return self.tk.call(self._w, 'entrycget', index, '-' + option) 34227db96d56Sopenharmony_ci 34237db96d56Sopenharmony_ci def entryconfigure(self, index, cnf=None, **kw): 34247db96d56Sopenharmony_ci """Configure a menu item at INDEX.""" 34257db96d56Sopenharmony_ci return self._configure(('entryconfigure', index), cnf, kw) 34267db96d56Sopenharmony_ci 34277db96d56Sopenharmony_ci entryconfig = entryconfigure 34287db96d56Sopenharmony_ci 34297db96d56Sopenharmony_ci def index(self, index): 34307db96d56Sopenharmony_ci """Return the index of a menu item identified by INDEX.""" 34317db96d56Sopenharmony_ci i = self.tk.call(self._w, 'index', index) 34327db96d56Sopenharmony_ci return None if i in ('', 'none') else self.tk.getint(i) # GH-103685. 34337db96d56Sopenharmony_ci 34347db96d56Sopenharmony_ci def invoke(self, index): 34357db96d56Sopenharmony_ci """Invoke a menu item identified by INDEX and execute 34367db96d56Sopenharmony_ci the associated command.""" 34377db96d56Sopenharmony_ci return self.tk.call(self._w, 'invoke', index) 34387db96d56Sopenharmony_ci 34397db96d56Sopenharmony_ci def post(self, x, y): 34407db96d56Sopenharmony_ci """Display a menu at position X,Y.""" 34417db96d56Sopenharmony_ci self.tk.call(self._w, 'post', x, y) 34427db96d56Sopenharmony_ci 34437db96d56Sopenharmony_ci def type(self, index): 34447db96d56Sopenharmony_ci """Return the type of the menu item at INDEX.""" 34457db96d56Sopenharmony_ci return self.tk.call(self._w, 'type', index) 34467db96d56Sopenharmony_ci 34477db96d56Sopenharmony_ci def unpost(self): 34487db96d56Sopenharmony_ci """Unmap a menu.""" 34497db96d56Sopenharmony_ci self.tk.call(self._w, 'unpost') 34507db96d56Sopenharmony_ci 34517db96d56Sopenharmony_ci def xposition(self, index): # new in Tk 8.5 34527db96d56Sopenharmony_ci """Return the x-position of the leftmost pixel of the menu item 34537db96d56Sopenharmony_ci at INDEX.""" 34547db96d56Sopenharmony_ci return self.tk.getint(self.tk.call(self._w, 'xposition', index)) 34557db96d56Sopenharmony_ci 34567db96d56Sopenharmony_ci def yposition(self, index): 34577db96d56Sopenharmony_ci """Return the y-position of the topmost pixel of the menu item at INDEX.""" 34587db96d56Sopenharmony_ci return self.tk.getint(self.tk.call( 34597db96d56Sopenharmony_ci self._w, 'yposition', index)) 34607db96d56Sopenharmony_ci 34617db96d56Sopenharmony_ci 34627db96d56Sopenharmony_ciclass Menubutton(Widget): 34637db96d56Sopenharmony_ci """Menubutton widget, obsolete since Tk8.0.""" 34647db96d56Sopenharmony_ci 34657db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 34667db96d56Sopenharmony_ci Widget.__init__(self, master, 'menubutton', cnf, kw) 34677db96d56Sopenharmony_ci 34687db96d56Sopenharmony_ci 34697db96d56Sopenharmony_ciclass Message(Widget): 34707db96d56Sopenharmony_ci """Message widget to display multiline text. Obsolete since Label does it too.""" 34717db96d56Sopenharmony_ci 34727db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 34737db96d56Sopenharmony_ci Widget.__init__(self, master, 'message', cnf, kw) 34747db96d56Sopenharmony_ci 34757db96d56Sopenharmony_ci 34767db96d56Sopenharmony_ciclass Radiobutton(Widget): 34777db96d56Sopenharmony_ci """Radiobutton widget which shows only one of several buttons in on-state.""" 34787db96d56Sopenharmony_ci 34797db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 34807db96d56Sopenharmony_ci """Construct a radiobutton widget with the parent MASTER. 34817db96d56Sopenharmony_ci 34827db96d56Sopenharmony_ci Valid resource names: activebackground, activeforeground, anchor, 34837db96d56Sopenharmony_ci background, bd, bg, bitmap, borderwidth, command, cursor, 34847db96d56Sopenharmony_ci disabledforeground, fg, font, foreground, height, 34857db96d56Sopenharmony_ci highlightbackground, highlightcolor, highlightthickness, image, 34867db96d56Sopenharmony_ci indicatoron, justify, padx, pady, relief, selectcolor, selectimage, 34877db96d56Sopenharmony_ci state, takefocus, text, textvariable, underline, value, variable, 34887db96d56Sopenharmony_ci width, wraplength.""" 34897db96d56Sopenharmony_ci Widget.__init__(self, master, 'radiobutton', cnf, kw) 34907db96d56Sopenharmony_ci 34917db96d56Sopenharmony_ci def deselect(self): 34927db96d56Sopenharmony_ci """Put the button in off-state.""" 34937db96d56Sopenharmony_ci 34947db96d56Sopenharmony_ci self.tk.call(self._w, 'deselect') 34957db96d56Sopenharmony_ci 34967db96d56Sopenharmony_ci def flash(self): 34977db96d56Sopenharmony_ci """Flash the button.""" 34987db96d56Sopenharmony_ci self.tk.call(self._w, 'flash') 34997db96d56Sopenharmony_ci 35007db96d56Sopenharmony_ci def invoke(self): 35017db96d56Sopenharmony_ci """Toggle the button and invoke a command if given as resource.""" 35027db96d56Sopenharmony_ci return self.tk.call(self._w, 'invoke') 35037db96d56Sopenharmony_ci 35047db96d56Sopenharmony_ci def select(self): 35057db96d56Sopenharmony_ci """Put the button in on-state.""" 35067db96d56Sopenharmony_ci self.tk.call(self._w, 'select') 35077db96d56Sopenharmony_ci 35087db96d56Sopenharmony_ci 35097db96d56Sopenharmony_ciclass Scale(Widget): 35107db96d56Sopenharmony_ci """Scale widget which can display a numerical scale.""" 35117db96d56Sopenharmony_ci 35127db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 35137db96d56Sopenharmony_ci """Construct a scale widget with the parent MASTER. 35147db96d56Sopenharmony_ci 35157db96d56Sopenharmony_ci Valid resource names: activebackground, background, bigincrement, bd, 35167db96d56Sopenharmony_ci bg, borderwidth, command, cursor, digits, fg, font, foreground, from, 35177db96d56Sopenharmony_ci highlightbackground, highlightcolor, highlightthickness, label, 35187db96d56Sopenharmony_ci length, orient, relief, repeatdelay, repeatinterval, resolution, 35197db96d56Sopenharmony_ci showvalue, sliderlength, sliderrelief, state, takefocus, 35207db96d56Sopenharmony_ci tickinterval, to, troughcolor, variable, width.""" 35217db96d56Sopenharmony_ci Widget.__init__(self, master, 'scale', cnf, kw) 35227db96d56Sopenharmony_ci 35237db96d56Sopenharmony_ci def get(self): 35247db96d56Sopenharmony_ci """Get the current value as integer or float.""" 35257db96d56Sopenharmony_ci value = self.tk.call(self._w, 'get') 35267db96d56Sopenharmony_ci try: 35277db96d56Sopenharmony_ci return self.tk.getint(value) 35287db96d56Sopenharmony_ci except (ValueError, TypeError, TclError): 35297db96d56Sopenharmony_ci return self.tk.getdouble(value) 35307db96d56Sopenharmony_ci 35317db96d56Sopenharmony_ci def set(self, value): 35327db96d56Sopenharmony_ci """Set the value to VALUE.""" 35337db96d56Sopenharmony_ci self.tk.call(self._w, 'set', value) 35347db96d56Sopenharmony_ci 35357db96d56Sopenharmony_ci def coords(self, value=None): 35367db96d56Sopenharmony_ci """Return a tuple (X,Y) of the point along the centerline of the 35377db96d56Sopenharmony_ci trough that corresponds to VALUE or the current value if None is 35387db96d56Sopenharmony_ci given.""" 35397db96d56Sopenharmony_ci 35407db96d56Sopenharmony_ci return self._getints(self.tk.call(self._w, 'coords', value)) 35417db96d56Sopenharmony_ci 35427db96d56Sopenharmony_ci def identify(self, x, y): 35437db96d56Sopenharmony_ci """Return where the point X,Y lies. Valid return values are "slider", 35447db96d56Sopenharmony_ci "though1" and "though2".""" 35457db96d56Sopenharmony_ci return self.tk.call(self._w, 'identify', x, y) 35467db96d56Sopenharmony_ci 35477db96d56Sopenharmony_ci 35487db96d56Sopenharmony_ciclass Scrollbar(Widget): 35497db96d56Sopenharmony_ci """Scrollbar widget which displays a slider at a certain position.""" 35507db96d56Sopenharmony_ci 35517db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 35527db96d56Sopenharmony_ci """Construct a scrollbar widget with the parent MASTER. 35537db96d56Sopenharmony_ci 35547db96d56Sopenharmony_ci Valid resource names: activebackground, activerelief, 35557db96d56Sopenharmony_ci background, bd, bg, borderwidth, command, cursor, 35567db96d56Sopenharmony_ci elementborderwidth, highlightbackground, 35577db96d56Sopenharmony_ci highlightcolor, highlightthickness, jump, orient, 35587db96d56Sopenharmony_ci relief, repeatdelay, repeatinterval, takefocus, 35597db96d56Sopenharmony_ci troughcolor, width.""" 35607db96d56Sopenharmony_ci Widget.__init__(self, master, 'scrollbar', cnf, kw) 35617db96d56Sopenharmony_ci 35627db96d56Sopenharmony_ci def activate(self, index=None): 35637db96d56Sopenharmony_ci """Marks the element indicated by index as active. 35647db96d56Sopenharmony_ci The only index values understood by this method are "arrow1", 35657db96d56Sopenharmony_ci "slider", or "arrow2". If any other value is specified then no 35667db96d56Sopenharmony_ci element of the scrollbar will be active. If index is not specified, 35677db96d56Sopenharmony_ci the method returns the name of the element that is currently active, 35687db96d56Sopenharmony_ci or None if no element is active.""" 35697db96d56Sopenharmony_ci return self.tk.call(self._w, 'activate', index) or None 35707db96d56Sopenharmony_ci 35717db96d56Sopenharmony_ci def delta(self, deltax, deltay): 35727db96d56Sopenharmony_ci """Return the fractional change of the scrollbar setting if it 35737db96d56Sopenharmony_ci would be moved by DELTAX or DELTAY pixels.""" 35747db96d56Sopenharmony_ci return self.tk.getdouble( 35757db96d56Sopenharmony_ci self.tk.call(self._w, 'delta', deltax, deltay)) 35767db96d56Sopenharmony_ci 35777db96d56Sopenharmony_ci def fraction(self, x, y): 35787db96d56Sopenharmony_ci """Return the fractional value which corresponds to a slider 35797db96d56Sopenharmony_ci position of X,Y.""" 35807db96d56Sopenharmony_ci return self.tk.getdouble(self.tk.call(self._w, 'fraction', x, y)) 35817db96d56Sopenharmony_ci 35827db96d56Sopenharmony_ci def identify(self, x, y): 35837db96d56Sopenharmony_ci """Return the element under position X,Y as one of 35847db96d56Sopenharmony_ci "arrow1","slider","arrow2" or "".""" 35857db96d56Sopenharmony_ci return self.tk.call(self._w, 'identify', x, y) 35867db96d56Sopenharmony_ci 35877db96d56Sopenharmony_ci def get(self): 35887db96d56Sopenharmony_ci """Return the current fractional values (upper and lower end) 35897db96d56Sopenharmony_ci of the slider position.""" 35907db96d56Sopenharmony_ci return self._getdoubles(self.tk.call(self._w, 'get')) 35917db96d56Sopenharmony_ci 35927db96d56Sopenharmony_ci def set(self, first, last): 35937db96d56Sopenharmony_ci """Set the fractional values of the slider position (upper and 35947db96d56Sopenharmony_ci lower ends as value between 0 and 1).""" 35957db96d56Sopenharmony_ci self.tk.call(self._w, 'set', first, last) 35967db96d56Sopenharmony_ci 35977db96d56Sopenharmony_ci 35987db96d56Sopenharmony_ciclass Text(Widget, XView, YView): 35997db96d56Sopenharmony_ci """Text widget which can display text in various forms.""" 36007db96d56Sopenharmony_ci 36017db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 36027db96d56Sopenharmony_ci """Construct a text widget with the parent MASTER. 36037db96d56Sopenharmony_ci 36047db96d56Sopenharmony_ci STANDARD OPTIONS 36057db96d56Sopenharmony_ci 36067db96d56Sopenharmony_ci background, borderwidth, cursor, 36077db96d56Sopenharmony_ci exportselection, font, foreground, 36087db96d56Sopenharmony_ci highlightbackground, highlightcolor, 36097db96d56Sopenharmony_ci highlightthickness, insertbackground, 36107db96d56Sopenharmony_ci insertborderwidth, insertofftime, 36117db96d56Sopenharmony_ci insertontime, insertwidth, padx, pady, 36127db96d56Sopenharmony_ci relief, selectbackground, 36137db96d56Sopenharmony_ci selectborderwidth, selectforeground, 36147db96d56Sopenharmony_ci setgrid, takefocus, 36157db96d56Sopenharmony_ci xscrollcommand, yscrollcommand, 36167db96d56Sopenharmony_ci 36177db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 36187db96d56Sopenharmony_ci 36197db96d56Sopenharmony_ci autoseparators, height, maxundo, 36207db96d56Sopenharmony_ci spacing1, spacing2, spacing3, 36217db96d56Sopenharmony_ci state, tabs, undo, width, wrap, 36227db96d56Sopenharmony_ci 36237db96d56Sopenharmony_ci """ 36247db96d56Sopenharmony_ci Widget.__init__(self, master, 'text', cnf, kw) 36257db96d56Sopenharmony_ci 36267db96d56Sopenharmony_ci def bbox(self, index): 36277db96d56Sopenharmony_ci """Return a tuple of (x,y,width,height) which gives the bounding 36287db96d56Sopenharmony_ci box of the visible part of the character at the given index.""" 36297db96d56Sopenharmony_ci return self._getints( 36307db96d56Sopenharmony_ci self.tk.call(self._w, 'bbox', index)) or None 36317db96d56Sopenharmony_ci 36327db96d56Sopenharmony_ci def compare(self, index1, op, index2): 36337db96d56Sopenharmony_ci """Return whether between index INDEX1 and index INDEX2 the 36347db96d56Sopenharmony_ci relation OP is satisfied. OP is one of <, <=, ==, >=, >, or !=.""" 36357db96d56Sopenharmony_ci return self.tk.getboolean(self.tk.call( 36367db96d56Sopenharmony_ci self._w, 'compare', index1, op, index2)) 36377db96d56Sopenharmony_ci 36387db96d56Sopenharmony_ci def count(self, index1, index2, *args): # new in Tk 8.5 36397db96d56Sopenharmony_ci """Counts the number of relevant things between the two indices. 36407db96d56Sopenharmony_ci If index1 is after index2, the result will be a negative number 36417db96d56Sopenharmony_ci (and this holds for each of the possible options). 36427db96d56Sopenharmony_ci 36437db96d56Sopenharmony_ci The actual items which are counted depends on the options given by 36447db96d56Sopenharmony_ci args. The result is a list of integers, one for the result of each 36457db96d56Sopenharmony_ci counting option given. Valid counting options are "chars", 36467db96d56Sopenharmony_ci "displaychars", "displayindices", "displaylines", "indices", 36477db96d56Sopenharmony_ci "lines", "xpixels" and "ypixels". There is an additional possible 36487db96d56Sopenharmony_ci option "update", which if given then all subsequent options ensure 36497db96d56Sopenharmony_ci that any possible out of date information is recalculated.""" 36507db96d56Sopenharmony_ci args = ['-%s' % arg for arg in args] 36517db96d56Sopenharmony_ci args += [index1, index2] 36527db96d56Sopenharmony_ci res = self.tk.call(self._w, 'count', *args) or None 36537db96d56Sopenharmony_ci if res is not None and len(args) <= 3: 36547db96d56Sopenharmony_ci return (res, ) 36557db96d56Sopenharmony_ci else: 36567db96d56Sopenharmony_ci return res 36577db96d56Sopenharmony_ci 36587db96d56Sopenharmony_ci def debug(self, boolean=None): 36597db96d56Sopenharmony_ci """Turn on the internal consistency checks of the B-Tree inside the text 36607db96d56Sopenharmony_ci widget according to BOOLEAN.""" 36617db96d56Sopenharmony_ci if boolean is None: 36627db96d56Sopenharmony_ci return self.tk.getboolean(self.tk.call(self._w, 'debug')) 36637db96d56Sopenharmony_ci self.tk.call(self._w, 'debug', boolean) 36647db96d56Sopenharmony_ci 36657db96d56Sopenharmony_ci def delete(self, index1, index2=None): 36667db96d56Sopenharmony_ci """Delete the characters between INDEX1 and INDEX2 (not included).""" 36677db96d56Sopenharmony_ci self.tk.call(self._w, 'delete', index1, index2) 36687db96d56Sopenharmony_ci 36697db96d56Sopenharmony_ci def dlineinfo(self, index): 36707db96d56Sopenharmony_ci """Return tuple (x,y,width,height,baseline) giving the bounding box 36717db96d56Sopenharmony_ci and baseline position of the visible part of the line containing 36727db96d56Sopenharmony_ci the character at INDEX.""" 36737db96d56Sopenharmony_ci return self._getints(self.tk.call(self._w, 'dlineinfo', index)) 36747db96d56Sopenharmony_ci 36757db96d56Sopenharmony_ci def dump(self, index1, index2=None, command=None, **kw): 36767db96d56Sopenharmony_ci """Return the contents of the widget between index1 and index2. 36777db96d56Sopenharmony_ci 36787db96d56Sopenharmony_ci The type of contents returned in filtered based on the keyword 36797db96d56Sopenharmony_ci parameters; if 'all', 'image', 'mark', 'tag', 'text', or 'window' are 36807db96d56Sopenharmony_ci given and true, then the corresponding items are returned. The result 36817db96d56Sopenharmony_ci is a list of triples of the form (key, value, index). If none of the 36827db96d56Sopenharmony_ci keywords are true then 'all' is used by default. 36837db96d56Sopenharmony_ci 36847db96d56Sopenharmony_ci If the 'command' argument is given, it is called once for each element 36857db96d56Sopenharmony_ci of the list of triples, with the values of each triple serving as the 36867db96d56Sopenharmony_ci arguments to the function. In this case the list is not returned.""" 36877db96d56Sopenharmony_ci args = [] 36887db96d56Sopenharmony_ci func_name = None 36897db96d56Sopenharmony_ci result = None 36907db96d56Sopenharmony_ci if not command: 36917db96d56Sopenharmony_ci # Never call the dump command without the -command flag, since the 36927db96d56Sopenharmony_ci # output could involve Tcl quoting and would be a pain to parse 36937db96d56Sopenharmony_ci # right. Instead just set the command to build a list of triples 36947db96d56Sopenharmony_ci # as if we had done the parsing. 36957db96d56Sopenharmony_ci result = [] 36967db96d56Sopenharmony_ci def append_triple(key, value, index, result=result): 36977db96d56Sopenharmony_ci result.append((key, value, index)) 36987db96d56Sopenharmony_ci command = append_triple 36997db96d56Sopenharmony_ci try: 37007db96d56Sopenharmony_ci if not isinstance(command, str): 37017db96d56Sopenharmony_ci func_name = command = self._register(command) 37027db96d56Sopenharmony_ci args += ["-command", command] 37037db96d56Sopenharmony_ci for key in kw: 37047db96d56Sopenharmony_ci if kw[key]: args.append("-" + key) 37057db96d56Sopenharmony_ci args.append(index1) 37067db96d56Sopenharmony_ci if index2: 37077db96d56Sopenharmony_ci args.append(index2) 37087db96d56Sopenharmony_ci self.tk.call(self._w, "dump", *args) 37097db96d56Sopenharmony_ci return result 37107db96d56Sopenharmony_ci finally: 37117db96d56Sopenharmony_ci if func_name: 37127db96d56Sopenharmony_ci self.deletecommand(func_name) 37137db96d56Sopenharmony_ci 37147db96d56Sopenharmony_ci ## new in tk8.4 37157db96d56Sopenharmony_ci def edit(self, *args): 37167db96d56Sopenharmony_ci """Internal method 37177db96d56Sopenharmony_ci 37187db96d56Sopenharmony_ci This method controls the undo mechanism and 37197db96d56Sopenharmony_ci the modified flag. The exact behavior of the 37207db96d56Sopenharmony_ci command depends on the option argument that 37217db96d56Sopenharmony_ci follows the edit argument. The following forms 37227db96d56Sopenharmony_ci of the command are currently supported: 37237db96d56Sopenharmony_ci 37247db96d56Sopenharmony_ci edit_modified, edit_redo, edit_reset, edit_separator 37257db96d56Sopenharmony_ci and edit_undo 37267db96d56Sopenharmony_ci 37277db96d56Sopenharmony_ci """ 37287db96d56Sopenharmony_ci return self.tk.call(self._w, 'edit', *args) 37297db96d56Sopenharmony_ci 37307db96d56Sopenharmony_ci def edit_modified(self, arg=None): 37317db96d56Sopenharmony_ci """Get or Set the modified flag 37327db96d56Sopenharmony_ci 37337db96d56Sopenharmony_ci If arg is not specified, returns the modified 37347db96d56Sopenharmony_ci flag of the widget. The insert, delete, edit undo and 37357db96d56Sopenharmony_ci edit redo commands or the user can set or clear the 37367db96d56Sopenharmony_ci modified flag. If boolean is specified, sets the 37377db96d56Sopenharmony_ci modified flag of the widget to arg. 37387db96d56Sopenharmony_ci """ 37397db96d56Sopenharmony_ci return self.edit("modified", arg) 37407db96d56Sopenharmony_ci 37417db96d56Sopenharmony_ci def edit_redo(self): 37427db96d56Sopenharmony_ci """Redo the last undone edit 37437db96d56Sopenharmony_ci 37447db96d56Sopenharmony_ci When the undo option is true, reapplies the last 37457db96d56Sopenharmony_ci undone edits provided no other edits were done since 37467db96d56Sopenharmony_ci then. Generates an error when the redo stack is empty. 37477db96d56Sopenharmony_ci Does nothing when the undo option is false. 37487db96d56Sopenharmony_ci """ 37497db96d56Sopenharmony_ci return self.edit("redo") 37507db96d56Sopenharmony_ci 37517db96d56Sopenharmony_ci def edit_reset(self): 37527db96d56Sopenharmony_ci """Clears the undo and redo stacks 37537db96d56Sopenharmony_ci """ 37547db96d56Sopenharmony_ci return self.edit("reset") 37557db96d56Sopenharmony_ci 37567db96d56Sopenharmony_ci def edit_separator(self): 37577db96d56Sopenharmony_ci """Inserts a separator (boundary) on the undo stack. 37587db96d56Sopenharmony_ci 37597db96d56Sopenharmony_ci Does nothing when the undo option is false 37607db96d56Sopenharmony_ci """ 37617db96d56Sopenharmony_ci return self.edit("separator") 37627db96d56Sopenharmony_ci 37637db96d56Sopenharmony_ci def edit_undo(self): 37647db96d56Sopenharmony_ci """Undoes the last edit action 37657db96d56Sopenharmony_ci 37667db96d56Sopenharmony_ci If the undo option is true. An edit action is defined 37677db96d56Sopenharmony_ci as all the insert and delete commands that are recorded 37687db96d56Sopenharmony_ci on the undo stack in between two separators. Generates 37697db96d56Sopenharmony_ci an error when the undo stack is empty. Does nothing 37707db96d56Sopenharmony_ci when the undo option is false 37717db96d56Sopenharmony_ci """ 37727db96d56Sopenharmony_ci return self.edit("undo") 37737db96d56Sopenharmony_ci 37747db96d56Sopenharmony_ci def get(self, index1, index2=None): 37757db96d56Sopenharmony_ci """Return the text from INDEX1 to INDEX2 (not included).""" 37767db96d56Sopenharmony_ci return self.tk.call(self._w, 'get', index1, index2) 37777db96d56Sopenharmony_ci # (Image commands are new in 8.0) 37787db96d56Sopenharmony_ci 37797db96d56Sopenharmony_ci def image_cget(self, index, option): 37807db96d56Sopenharmony_ci """Return the value of OPTION of an embedded image at INDEX.""" 37817db96d56Sopenharmony_ci if option[:1] != "-": 37827db96d56Sopenharmony_ci option = "-" + option 37837db96d56Sopenharmony_ci if option[-1:] == "_": 37847db96d56Sopenharmony_ci option = option[:-1] 37857db96d56Sopenharmony_ci return self.tk.call(self._w, "image", "cget", index, option) 37867db96d56Sopenharmony_ci 37877db96d56Sopenharmony_ci def image_configure(self, index, cnf=None, **kw): 37887db96d56Sopenharmony_ci """Configure an embedded image at INDEX.""" 37897db96d56Sopenharmony_ci return self._configure(('image', 'configure', index), cnf, kw) 37907db96d56Sopenharmony_ci 37917db96d56Sopenharmony_ci def image_create(self, index, cnf={}, **kw): 37927db96d56Sopenharmony_ci """Create an embedded image at INDEX.""" 37937db96d56Sopenharmony_ci return self.tk.call( 37947db96d56Sopenharmony_ci self._w, "image", "create", index, 37957db96d56Sopenharmony_ci *self._options(cnf, kw)) 37967db96d56Sopenharmony_ci 37977db96d56Sopenharmony_ci def image_names(self): 37987db96d56Sopenharmony_ci """Return all names of embedded images in this widget.""" 37997db96d56Sopenharmony_ci return self.tk.call(self._w, "image", "names") 38007db96d56Sopenharmony_ci 38017db96d56Sopenharmony_ci def index(self, index): 38027db96d56Sopenharmony_ci """Return the index in the form line.char for INDEX.""" 38037db96d56Sopenharmony_ci return str(self.tk.call(self._w, 'index', index)) 38047db96d56Sopenharmony_ci 38057db96d56Sopenharmony_ci def insert(self, index, chars, *args): 38067db96d56Sopenharmony_ci """Insert CHARS before the characters at INDEX. An additional 38077db96d56Sopenharmony_ci tag can be given in ARGS. Additional CHARS and tags can follow in ARGS.""" 38087db96d56Sopenharmony_ci self.tk.call((self._w, 'insert', index, chars) + args) 38097db96d56Sopenharmony_ci 38107db96d56Sopenharmony_ci def mark_gravity(self, markName, direction=None): 38117db96d56Sopenharmony_ci """Change the gravity of a mark MARKNAME to DIRECTION (LEFT or RIGHT). 38127db96d56Sopenharmony_ci Return the current value if None is given for DIRECTION.""" 38137db96d56Sopenharmony_ci return self.tk.call( 38147db96d56Sopenharmony_ci (self._w, 'mark', 'gravity', markName, direction)) 38157db96d56Sopenharmony_ci 38167db96d56Sopenharmony_ci def mark_names(self): 38177db96d56Sopenharmony_ci """Return all mark names.""" 38187db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call( 38197db96d56Sopenharmony_ci self._w, 'mark', 'names')) 38207db96d56Sopenharmony_ci 38217db96d56Sopenharmony_ci def mark_set(self, markName, index): 38227db96d56Sopenharmony_ci """Set mark MARKNAME before the character at INDEX.""" 38237db96d56Sopenharmony_ci self.tk.call(self._w, 'mark', 'set', markName, index) 38247db96d56Sopenharmony_ci 38257db96d56Sopenharmony_ci def mark_unset(self, *markNames): 38267db96d56Sopenharmony_ci """Delete all marks in MARKNAMES.""" 38277db96d56Sopenharmony_ci self.tk.call((self._w, 'mark', 'unset') + markNames) 38287db96d56Sopenharmony_ci 38297db96d56Sopenharmony_ci def mark_next(self, index): 38307db96d56Sopenharmony_ci """Return the name of the next mark after INDEX.""" 38317db96d56Sopenharmony_ci return self.tk.call(self._w, 'mark', 'next', index) or None 38327db96d56Sopenharmony_ci 38337db96d56Sopenharmony_ci def mark_previous(self, index): 38347db96d56Sopenharmony_ci """Return the name of the previous mark before INDEX.""" 38357db96d56Sopenharmony_ci return self.tk.call(self._w, 'mark', 'previous', index) or None 38367db96d56Sopenharmony_ci 38377db96d56Sopenharmony_ci def peer_create(self, newPathName, cnf={}, **kw): # new in Tk 8.5 38387db96d56Sopenharmony_ci """Creates a peer text widget with the given newPathName, and any 38397db96d56Sopenharmony_ci optional standard configuration options. By default the peer will 38407db96d56Sopenharmony_ci have the same start and end line as the parent widget, but 38417db96d56Sopenharmony_ci these can be overridden with the standard configuration options.""" 38427db96d56Sopenharmony_ci self.tk.call(self._w, 'peer', 'create', newPathName, 38437db96d56Sopenharmony_ci *self._options(cnf, kw)) 38447db96d56Sopenharmony_ci 38457db96d56Sopenharmony_ci def peer_names(self): # new in Tk 8.5 38467db96d56Sopenharmony_ci """Returns a list of peers of this widget (this does not include 38477db96d56Sopenharmony_ci the widget itself).""" 38487db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call(self._w, 'peer', 'names')) 38497db96d56Sopenharmony_ci 38507db96d56Sopenharmony_ci def replace(self, index1, index2, chars, *args): # new in Tk 8.5 38517db96d56Sopenharmony_ci """Replaces the range of characters between index1 and index2 with 38527db96d56Sopenharmony_ci the given characters and tags specified by args. 38537db96d56Sopenharmony_ci 38547db96d56Sopenharmony_ci See the method insert for some more information about args, and the 38557db96d56Sopenharmony_ci method delete for information about the indices.""" 38567db96d56Sopenharmony_ci self.tk.call(self._w, 'replace', index1, index2, chars, *args) 38577db96d56Sopenharmony_ci 38587db96d56Sopenharmony_ci def scan_mark(self, x, y): 38597db96d56Sopenharmony_ci """Remember the current X, Y coordinates.""" 38607db96d56Sopenharmony_ci self.tk.call(self._w, 'scan', 'mark', x, y) 38617db96d56Sopenharmony_ci 38627db96d56Sopenharmony_ci def scan_dragto(self, x, y): 38637db96d56Sopenharmony_ci """Adjust the view of the text to 10 times the 38647db96d56Sopenharmony_ci difference between X and Y and the coordinates given in 38657db96d56Sopenharmony_ci scan_mark.""" 38667db96d56Sopenharmony_ci self.tk.call(self._w, 'scan', 'dragto', x, y) 38677db96d56Sopenharmony_ci 38687db96d56Sopenharmony_ci def search(self, pattern, index, stopindex=None, 38697db96d56Sopenharmony_ci forwards=None, backwards=None, exact=None, 38707db96d56Sopenharmony_ci regexp=None, nocase=None, count=None, elide=None): 38717db96d56Sopenharmony_ci """Search PATTERN beginning from INDEX until STOPINDEX. 38727db96d56Sopenharmony_ci Return the index of the first character of a match or an 38737db96d56Sopenharmony_ci empty string.""" 38747db96d56Sopenharmony_ci args = [self._w, 'search'] 38757db96d56Sopenharmony_ci if forwards: args.append('-forwards') 38767db96d56Sopenharmony_ci if backwards: args.append('-backwards') 38777db96d56Sopenharmony_ci if exact: args.append('-exact') 38787db96d56Sopenharmony_ci if regexp: args.append('-regexp') 38797db96d56Sopenharmony_ci if nocase: args.append('-nocase') 38807db96d56Sopenharmony_ci if elide: args.append('-elide') 38817db96d56Sopenharmony_ci if count: args.append('-count'); args.append(count) 38827db96d56Sopenharmony_ci if pattern and pattern[0] == '-': args.append('--') 38837db96d56Sopenharmony_ci args.append(pattern) 38847db96d56Sopenharmony_ci args.append(index) 38857db96d56Sopenharmony_ci if stopindex: args.append(stopindex) 38867db96d56Sopenharmony_ci return str(self.tk.call(tuple(args))) 38877db96d56Sopenharmony_ci 38887db96d56Sopenharmony_ci def see(self, index): 38897db96d56Sopenharmony_ci """Scroll such that the character at INDEX is visible.""" 38907db96d56Sopenharmony_ci self.tk.call(self._w, 'see', index) 38917db96d56Sopenharmony_ci 38927db96d56Sopenharmony_ci def tag_add(self, tagName, index1, *args): 38937db96d56Sopenharmony_ci """Add tag TAGNAME to all characters between INDEX1 and index2 in ARGS. 38947db96d56Sopenharmony_ci Additional pairs of indices may follow in ARGS.""" 38957db96d56Sopenharmony_ci self.tk.call( 38967db96d56Sopenharmony_ci (self._w, 'tag', 'add', tagName, index1) + args) 38977db96d56Sopenharmony_ci 38987db96d56Sopenharmony_ci def tag_unbind(self, tagName, sequence, funcid=None): 38997db96d56Sopenharmony_ci """Unbind for all characters with TAGNAME for event SEQUENCE the 39007db96d56Sopenharmony_ci function identified with FUNCID.""" 39017db96d56Sopenharmony_ci self.tk.call(self._w, 'tag', 'bind', tagName, sequence, '') 39027db96d56Sopenharmony_ci if funcid: 39037db96d56Sopenharmony_ci self.deletecommand(funcid) 39047db96d56Sopenharmony_ci 39057db96d56Sopenharmony_ci def tag_bind(self, tagName, sequence, func, add=None): 39067db96d56Sopenharmony_ci """Bind to all characters with TAGNAME at event SEQUENCE a call to function FUNC. 39077db96d56Sopenharmony_ci 39087db96d56Sopenharmony_ci An additional boolean parameter ADD specifies whether FUNC will be 39097db96d56Sopenharmony_ci called additionally to the other bound function or whether it will 39107db96d56Sopenharmony_ci replace the previous function. See bind for the return value.""" 39117db96d56Sopenharmony_ci return self._bind((self._w, 'tag', 'bind', tagName), 39127db96d56Sopenharmony_ci sequence, func, add) 39137db96d56Sopenharmony_ci 39147db96d56Sopenharmony_ci def tag_cget(self, tagName, option): 39157db96d56Sopenharmony_ci """Return the value of OPTION for tag TAGNAME.""" 39167db96d56Sopenharmony_ci if option[:1] != '-': 39177db96d56Sopenharmony_ci option = '-' + option 39187db96d56Sopenharmony_ci if option[-1:] == '_': 39197db96d56Sopenharmony_ci option = option[:-1] 39207db96d56Sopenharmony_ci return self.tk.call(self._w, 'tag', 'cget', tagName, option) 39217db96d56Sopenharmony_ci 39227db96d56Sopenharmony_ci def tag_configure(self, tagName, cnf=None, **kw): 39237db96d56Sopenharmony_ci """Configure a tag TAGNAME.""" 39247db96d56Sopenharmony_ci return self._configure(('tag', 'configure', tagName), cnf, kw) 39257db96d56Sopenharmony_ci 39267db96d56Sopenharmony_ci tag_config = tag_configure 39277db96d56Sopenharmony_ci 39287db96d56Sopenharmony_ci def tag_delete(self, *tagNames): 39297db96d56Sopenharmony_ci """Delete all tags in TAGNAMES.""" 39307db96d56Sopenharmony_ci self.tk.call((self._w, 'tag', 'delete') + tagNames) 39317db96d56Sopenharmony_ci 39327db96d56Sopenharmony_ci def tag_lower(self, tagName, belowThis=None): 39337db96d56Sopenharmony_ci """Change the priority of tag TAGNAME such that it is lower 39347db96d56Sopenharmony_ci than the priority of BELOWTHIS.""" 39357db96d56Sopenharmony_ci self.tk.call(self._w, 'tag', 'lower', tagName, belowThis) 39367db96d56Sopenharmony_ci 39377db96d56Sopenharmony_ci def tag_names(self, index=None): 39387db96d56Sopenharmony_ci """Return a list of all tag names.""" 39397db96d56Sopenharmony_ci return self.tk.splitlist( 39407db96d56Sopenharmony_ci self.tk.call(self._w, 'tag', 'names', index)) 39417db96d56Sopenharmony_ci 39427db96d56Sopenharmony_ci def tag_nextrange(self, tagName, index1, index2=None): 39437db96d56Sopenharmony_ci """Return a list of start and end index for the first sequence of 39447db96d56Sopenharmony_ci characters between INDEX1 and INDEX2 which all have tag TAGNAME. 39457db96d56Sopenharmony_ci The text is searched forward from INDEX1.""" 39467db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call( 39477db96d56Sopenharmony_ci self._w, 'tag', 'nextrange', tagName, index1, index2)) 39487db96d56Sopenharmony_ci 39497db96d56Sopenharmony_ci def tag_prevrange(self, tagName, index1, index2=None): 39507db96d56Sopenharmony_ci """Return a list of start and end index for the first sequence of 39517db96d56Sopenharmony_ci characters between INDEX1 and INDEX2 which all have tag TAGNAME. 39527db96d56Sopenharmony_ci The text is searched backwards from INDEX1.""" 39537db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call( 39547db96d56Sopenharmony_ci self._w, 'tag', 'prevrange', tagName, index1, index2)) 39557db96d56Sopenharmony_ci 39567db96d56Sopenharmony_ci def tag_raise(self, tagName, aboveThis=None): 39577db96d56Sopenharmony_ci """Change the priority of tag TAGNAME such that it is higher 39587db96d56Sopenharmony_ci than the priority of ABOVETHIS.""" 39597db96d56Sopenharmony_ci self.tk.call( 39607db96d56Sopenharmony_ci self._w, 'tag', 'raise', tagName, aboveThis) 39617db96d56Sopenharmony_ci 39627db96d56Sopenharmony_ci def tag_ranges(self, tagName): 39637db96d56Sopenharmony_ci """Return a list of ranges of text which have tag TAGNAME.""" 39647db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call( 39657db96d56Sopenharmony_ci self._w, 'tag', 'ranges', tagName)) 39667db96d56Sopenharmony_ci 39677db96d56Sopenharmony_ci def tag_remove(self, tagName, index1, index2=None): 39687db96d56Sopenharmony_ci """Remove tag TAGNAME from all characters between INDEX1 and INDEX2.""" 39697db96d56Sopenharmony_ci self.tk.call( 39707db96d56Sopenharmony_ci self._w, 'tag', 'remove', tagName, index1, index2) 39717db96d56Sopenharmony_ci 39727db96d56Sopenharmony_ci def window_cget(self, index, option): 39737db96d56Sopenharmony_ci """Return the value of OPTION of an embedded window at INDEX.""" 39747db96d56Sopenharmony_ci if option[:1] != '-': 39757db96d56Sopenharmony_ci option = '-' + option 39767db96d56Sopenharmony_ci if option[-1:] == '_': 39777db96d56Sopenharmony_ci option = option[:-1] 39787db96d56Sopenharmony_ci return self.tk.call(self._w, 'window', 'cget', index, option) 39797db96d56Sopenharmony_ci 39807db96d56Sopenharmony_ci def window_configure(self, index, cnf=None, **kw): 39817db96d56Sopenharmony_ci """Configure an embedded window at INDEX.""" 39827db96d56Sopenharmony_ci return self._configure(('window', 'configure', index), cnf, kw) 39837db96d56Sopenharmony_ci 39847db96d56Sopenharmony_ci window_config = window_configure 39857db96d56Sopenharmony_ci 39867db96d56Sopenharmony_ci def window_create(self, index, cnf={}, **kw): 39877db96d56Sopenharmony_ci """Create a window at INDEX.""" 39887db96d56Sopenharmony_ci self.tk.call( 39897db96d56Sopenharmony_ci (self._w, 'window', 'create', index) 39907db96d56Sopenharmony_ci + self._options(cnf, kw)) 39917db96d56Sopenharmony_ci 39927db96d56Sopenharmony_ci def window_names(self): 39937db96d56Sopenharmony_ci """Return all names of embedded windows in this widget.""" 39947db96d56Sopenharmony_ci return self.tk.splitlist( 39957db96d56Sopenharmony_ci self.tk.call(self._w, 'window', 'names')) 39967db96d56Sopenharmony_ci 39977db96d56Sopenharmony_ci def yview_pickplace(self, *what): 39987db96d56Sopenharmony_ci """Obsolete function, use see.""" 39997db96d56Sopenharmony_ci self.tk.call((self._w, 'yview', '-pickplace') + what) 40007db96d56Sopenharmony_ci 40017db96d56Sopenharmony_ci 40027db96d56Sopenharmony_ciclass _setit: 40037db96d56Sopenharmony_ci """Internal class. It wraps the command in the widget OptionMenu.""" 40047db96d56Sopenharmony_ci 40057db96d56Sopenharmony_ci def __init__(self, var, value, callback=None): 40067db96d56Sopenharmony_ci self.__value = value 40077db96d56Sopenharmony_ci self.__var = var 40087db96d56Sopenharmony_ci self.__callback = callback 40097db96d56Sopenharmony_ci 40107db96d56Sopenharmony_ci def __call__(self, *args): 40117db96d56Sopenharmony_ci self.__var.set(self.__value) 40127db96d56Sopenharmony_ci if self.__callback is not None: 40137db96d56Sopenharmony_ci self.__callback(self.__value, *args) 40147db96d56Sopenharmony_ci 40157db96d56Sopenharmony_ci 40167db96d56Sopenharmony_ciclass OptionMenu(Menubutton): 40177db96d56Sopenharmony_ci """OptionMenu which allows the user to select a value from a menu.""" 40187db96d56Sopenharmony_ci 40197db96d56Sopenharmony_ci def __init__(self, master, variable, value, *values, **kwargs): 40207db96d56Sopenharmony_ci """Construct an optionmenu widget with the parent MASTER, with 40217db96d56Sopenharmony_ci the resource textvariable set to VARIABLE, the initially selected 40227db96d56Sopenharmony_ci value VALUE, the other menu values VALUES and an additional 40237db96d56Sopenharmony_ci keyword argument command.""" 40247db96d56Sopenharmony_ci kw = {"borderwidth": 2, "textvariable": variable, 40257db96d56Sopenharmony_ci "indicatoron": 1, "relief": RAISED, "anchor": "c", 40267db96d56Sopenharmony_ci "highlightthickness": 2} 40277db96d56Sopenharmony_ci Widget.__init__(self, master, "menubutton", kw) 40287db96d56Sopenharmony_ci self.widgetName = 'tk_optionMenu' 40297db96d56Sopenharmony_ci menu = self.__menu = Menu(self, name="menu", tearoff=0) 40307db96d56Sopenharmony_ci self.menuname = menu._w 40317db96d56Sopenharmony_ci # 'command' is the only supported keyword 40327db96d56Sopenharmony_ci callback = kwargs.get('command') 40337db96d56Sopenharmony_ci if 'command' in kwargs: 40347db96d56Sopenharmony_ci del kwargs['command'] 40357db96d56Sopenharmony_ci if kwargs: 40367db96d56Sopenharmony_ci raise TclError('unknown option -'+next(iter(kwargs))) 40377db96d56Sopenharmony_ci menu.add_command(label=value, 40387db96d56Sopenharmony_ci command=_setit(variable, value, callback)) 40397db96d56Sopenharmony_ci for v in values: 40407db96d56Sopenharmony_ci menu.add_command(label=v, 40417db96d56Sopenharmony_ci command=_setit(variable, v, callback)) 40427db96d56Sopenharmony_ci self["menu"] = menu 40437db96d56Sopenharmony_ci 40447db96d56Sopenharmony_ci def __getitem__(self, name): 40457db96d56Sopenharmony_ci if name == 'menu': 40467db96d56Sopenharmony_ci return self.__menu 40477db96d56Sopenharmony_ci return Widget.__getitem__(self, name) 40487db96d56Sopenharmony_ci 40497db96d56Sopenharmony_ci def destroy(self): 40507db96d56Sopenharmony_ci """Destroy this widget and the associated menu.""" 40517db96d56Sopenharmony_ci Menubutton.destroy(self) 40527db96d56Sopenharmony_ci self.__menu = None 40537db96d56Sopenharmony_ci 40547db96d56Sopenharmony_ci 40557db96d56Sopenharmony_ciclass Image: 40567db96d56Sopenharmony_ci """Base class for images.""" 40577db96d56Sopenharmony_ci _last_id = 0 40587db96d56Sopenharmony_ci 40597db96d56Sopenharmony_ci def __init__(self, imgtype, name=None, cnf={}, master=None, **kw): 40607db96d56Sopenharmony_ci self.name = None 40617db96d56Sopenharmony_ci if master is None: 40627db96d56Sopenharmony_ci master = _get_default_root('create image') 40637db96d56Sopenharmony_ci self.tk = getattr(master, 'tk', master) 40647db96d56Sopenharmony_ci if not name: 40657db96d56Sopenharmony_ci Image._last_id += 1 40667db96d56Sopenharmony_ci name = "pyimage%r" % (Image._last_id,) # tk itself would use image<x> 40677db96d56Sopenharmony_ci if kw and cnf: cnf = _cnfmerge((cnf, kw)) 40687db96d56Sopenharmony_ci elif kw: cnf = kw 40697db96d56Sopenharmony_ci options = () 40707db96d56Sopenharmony_ci for k, v in cnf.items(): 40717db96d56Sopenharmony_ci if callable(v): 40727db96d56Sopenharmony_ci v = self._register(v) 40737db96d56Sopenharmony_ci options = options + ('-'+k, v) 40747db96d56Sopenharmony_ci self.tk.call(('image', 'create', imgtype, name,) + options) 40757db96d56Sopenharmony_ci self.name = name 40767db96d56Sopenharmony_ci 40777db96d56Sopenharmony_ci def __str__(self): return self.name 40787db96d56Sopenharmony_ci 40797db96d56Sopenharmony_ci def __del__(self): 40807db96d56Sopenharmony_ci if self.name: 40817db96d56Sopenharmony_ci try: 40827db96d56Sopenharmony_ci self.tk.call('image', 'delete', self.name) 40837db96d56Sopenharmony_ci except TclError: 40847db96d56Sopenharmony_ci # May happen if the root was destroyed 40857db96d56Sopenharmony_ci pass 40867db96d56Sopenharmony_ci 40877db96d56Sopenharmony_ci def __setitem__(self, key, value): 40887db96d56Sopenharmony_ci self.tk.call(self.name, 'configure', '-'+key, value) 40897db96d56Sopenharmony_ci 40907db96d56Sopenharmony_ci def __getitem__(self, key): 40917db96d56Sopenharmony_ci return self.tk.call(self.name, 'configure', '-'+key) 40927db96d56Sopenharmony_ci 40937db96d56Sopenharmony_ci def configure(self, **kw): 40947db96d56Sopenharmony_ci """Configure the image.""" 40957db96d56Sopenharmony_ci res = () 40967db96d56Sopenharmony_ci for k, v in _cnfmerge(kw).items(): 40977db96d56Sopenharmony_ci if v is not None: 40987db96d56Sopenharmony_ci if k[-1] == '_': k = k[:-1] 40997db96d56Sopenharmony_ci if callable(v): 41007db96d56Sopenharmony_ci v = self._register(v) 41017db96d56Sopenharmony_ci res = res + ('-'+k, v) 41027db96d56Sopenharmony_ci self.tk.call((self.name, 'config') + res) 41037db96d56Sopenharmony_ci 41047db96d56Sopenharmony_ci config = configure 41057db96d56Sopenharmony_ci 41067db96d56Sopenharmony_ci def height(self): 41077db96d56Sopenharmony_ci """Return the height of the image.""" 41087db96d56Sopenharmony_ci return self.tk.getint( 41097db96d56Sopenharmony_ci self.tk.call('image', 'height', self.name)) 41107db96d56Sopenharmony_ci 41117db96d56Sopenharmony_ci def type(self): 41127db96d56Sopenharmony_ci """Return the type of the image, e.g. "photo" or "bitmap".""" 41137db96d56Sopenharmony_ci return self.tk.call('image', 'type', self.name) 41147db96d56Sopenharmony_ci 41157db96d56Sopenharmony_ci def width(self): 41167db96d56Sopenharmony_ci """Return the width of the image.""" 41177db96d56Sopenharmony_ci return self.tk.getint( 41187db96d56Sopenharmony_ci self.tk.call('image', 'width', self.name)) 41197db96d56Sopenharmony_ci 41207db96d56Sopenharmony_ci 41217db96d56Sopenharmony_ciclass PhotoImage(Image): 41227db96d56Sopenharmony_ci """Widget which can display images in PGM, PPM, GIF, PNG format.""" 41237db96d56Sopenharmony_ci 41247db96d56Sopenharmony_ci def __init__(self, name=None, cnf={}, master=None, **kw): 41257db96d56Sopenharmony_ci """Create an image with NAME. 41267db96d56Sopenharmony_ci 41277db96d56Sopenharmony_ci Valid resource names: data, format, file, gamma, height, palette, 41287db96d56Sopenharmony_ci width.""" 41297db96d56Sopenharmony_ci Image.__init__(self, 'photo', name, cnf, master, **kw) 41307db96d56Sopenharmony_ci 41317db96d56Sopenharmony_ci def blank(self): 41327db96d56Sopenharmony_ci """Display a transparent image.""" 41337db96d56Sopenharmony_ci self.tk.call(self.name, 'blank') 41347db96d56Sopenharmony_ci 41357db96d56Sopenharmony_ci def cget(self, option): 41367db96d56Sopenharmony_ci """Return the value of OPTION.""" 41377db96d56Sopenharmony_ci return self.tk.call(self.name, 'cget', '-' + option) 41387db96d56Sopenharmony_ci # XXX config 41397db96d56Sopenharmony_ci 41407db96d56Sopenharmony_ci def __getitem__(self, key): 41417db96d56Sopenharmony_ci return self.tk.call(self.name, 'cget', '-' + key) 41427db96d56Sopenharmony_ci # XXX copy -from, -to, ...? 41437db96d56Sopenharmony_ci 41447db96d56Sopenharmony_ci def copy(self): 41457db96d56Sopenharmony_ci """Return a new PhotoImage with the same image as this widget.""" 41467db96d56Sopenharmony_ci destImage = PhotoImage(master=self.tk) 41477db96d56Sopenharmony_ci self.tk.call(destImage, 'copy', self.name) 41487db96d56Sopenharmony_ci return destImage 41497db96d56Sopenharmony_ci 41507db96d56Sopenharmony_ci def zoom(self, x, y=''): 41517db96d56Sopenharmony_ci """Return a new PhotoImage with the same image as this widget 41527db96d56Sopenharmony_ci but zoom it with a factor of x in the X direction and y in the Y 41537db96d56Sopenharmony_ci direction. If y is not given, the default value is the same as x. 41547db96d56Sopenharmony_ci """ 41557db96d56Sopenharmony_ci destImage = PhotoImage(master=self.tk) 41567db96d56Sopenharmony_ci if y=='': y=x 41577db96d56Sopenharmony_ci self.tk.call(destImage, 'copy', self.name, '-zoom',x,y) 41587db96d56Sopenharmony_ci return destImage 41597db96d56Sopenharmony_ci 41607db96d56Sopenharmony_ci def subsample(self, x, y=''): 41617db96d56Sopenharmony_ci """Return a new PhotoImage based on the same image as this widget 41627db96d56Sopenharmony_ci but use only every Xth or Yth pixel. If y is not given, the 41637db96d56Sopenharmony_ci default value is the same as x. 41647db96d56Sopenharmony_ci """ 41657db96d56Sopenharmony_ci destImage = PhotoImage(master=self.tk) 41667db96d56Sopenharmony_ci if y=='': y=x 41677db96d56Sopenharmony_ci self.tk.call(destImage, 'copy', self.name, '-subsample',x,y) 41687db96d56Sopenharmony_ci return destImage 41697db96d56Sopenharmony_ci 41707db96d56Sopenharmony_ci def get(self, x, y): 41717db96d56Sopenharmony_ci """Return the color (red, green, blue) of the pixel at X,Y.""" 41727db96d56Sopenharmony_ci return self.tk.call(self.name, 'get', x, y) 41737db96d56Sopenharmony_ci 41747db96d56Sopenharmony_ci def put(self, data, to=None): 41757db96d56Sopenharmony_ci """Put row formatted colors to image starting from 41767db96d56Sopenharmony_ci position TO, e.g. image.put("{red green} {blue yellow}", to=(4,6))""" 41777db96d56Sopenharmony_ci args = (self.name, 'put', data) 41787db96d56Sopenharmony_ci if to: 41797db96d56Sopenharmony_ci if to[0] == '-to': 41807db96d56Sopenharmony_ci to = to[1:] 41817db96d56Sopenharmony_ci args = args + ('-to',) + tuple(to) 41827db96d56Sopenharmony_ci self.tk.call(args) 41837db96d56Sopenharmony_ci # XXX read 41847db96d56Sopenharmony_ci 41857db96d56Sopenharmony_ci def write(self, filename, format=None, from_coords=None): 41867db96d56Sopenharmony_ci """Write image to file FILENAME in FORMAT starting from 41877db96d56Sopenharmony_ci position FROM_COORDS.""" 41887db96d56Sopenharmony_ci args = (self.name, 'write', filename) 41897db96d56Sopenharmony_ci if format: 41907db96d56Sopenharmony_ci args = args + ('-format', format) 41917db96d56Sopenharmony_ci if from_coords: 41927db96d56Sopenharmony_ci args = args + ('-from',) + tuple(from_coords) 41937db96d56Sopenharmony_ci self.tk.call(args) 41947db96d56Sopenharmony_ci 41957db96d56Sopenharmony_ci def transparency_get(self, x, y): 41967db96d56Sopenharmony_ci """Return True if the pixel at x,y is transparent.""" 41977db96d56Sopenharmony_ci return self.tk.getboolean(self.tk.call( 41987db96d56Sopenharmony_ci self.name, 'transparency', 'get', x, y)) 41997db96d56Sopenharmony_ci 42007db96d56Sopenharmony_ci def transparency_set(self, x, y, boolean): 42017db96d56Sopenharmony_ci """Set the transparency of the pixel at x,y.""" 42027db96d56Sopenharmony_ci self.tk.call(self.name, 'transparency', 'set', x, y, boolean) 42037db96d56Sopenharmony_ci 42047db96d56Sopenharmony_ci 42057db96d56Sopenharmony_ciclass BitmapImage(Image): 42067db96d56Sopenharmony_ci """Widget which can display images in XBM format.""" 42077db96d56Sopenharmony_ci 42087db96d56Sopenharmony_ci def __init__(self, name=None, cnf={}, master=None, **kw): 42097db96d56Sopenharmony_ci """Create a bitmap with NAME. 42107db96d56Sopenharmony_ci 42117db96d56Sopenharmony_ci Valid resource names: background, data, file, foreground, maskdata, maskfile.""" 42127db96d56Sopenharmony_ci Image.__init__(self, 'bitmap', name, cnf, master, **kw) 42137db96d56Sopenharmony_ci 42147db96d56Sopenharmony_ci 42157db96d56Sopenharmony_cidef image_names(): 42167db96d56Sopenharmony_ci tk = _get_default_root('use image_names()').tk 42177db96d56Sopenharmony_ci return tk.splitlist(tk.call('image', 'names')) 42187db96d56Sopenharmony_ci 42197db96d56Sopenharmony_ci 42207db96d56Sopenharmony_cidef image_types(): 42217db96d56Sopenharmony_ci tk = _get_default_root('use image_types()').tk 42227db96d56Sopenharmony_ci return tk.splitlist(tk.call('image', 'types')) 42237db96d56Sopenharmony_ci 42247db96d56Sopenharmony_ci 42257db96d56Sopenharmony_ciclass Spinbox(Widget, XView): 42267db96d56Sopenharmony_ci """spinbox widget.""" 42277db96d56Sopenharmony_ci 42287db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 42297db96d56Sopenharmony_ci """Construct a spinbox widget with the parent MASTER. 42307db96d56Sopenharmony_ci 42317db96d56Sopenharmony_ci STANDARD OPTIONS 42327db96d56Sopenharmony_ci 42337db96d56Sopenharmony_ci activebackground, background, borderwidth, 42347db96d56Sopenharmony_ci cursor, exportselection, font, foreground, 42357db96d56Sopenharmony_ci highlightbackground, highlightcolor, 42367db96d56Sopenharmony_ci highlightthickness, insertbackground, 42377db96d56Sopenharmony_ci insertborderwidth, insertofftime, 42387db96d56Sopenharmony_ci insertontime, insertwidth, justify, relief, 42397db96d56Sopenharmony_ci repeatdelay, repeatinterval, 42407db96d56Sopenharmony_ci selectbackground, selectborderwidth 42417db96d56Sopenharmony_ci selectforeground, takefocus, textvariable 42427db96d56Sopenharmony_ci xscrollcommand. 42437db96d56Sopenharmony_ci 42447db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 42457db96d56Sopenharmony_ci 42467db96d56Sopenharmony_ci buttonbackground, buttoncursor, 42477db96d56Sopenharmony_ci buttondownrelief, buttonuprelief, 42487db96d56Sopenharmony_ci command, disabledbackground, 42497db96d56Sopenharmony_ci disabledforeground, format, from, 42507db96d56Sopenharmony_ci invalidcommand, increment, 42517db96d56Sopenharmony_ci readonlybackground, state, to, 42527db96d56Sopenharmony_ci validate, validatecommand values, 42537db96d56Sopenharmony_ci width, wrap, 42547db96d56Sopenharmony_ci """ 42557db96d56Sopenharmony_ci Widget.__init__(self, master, 'spinbox', cnf, kw) 42567db96d56Sopenharmony_ci 42577db96d56Sopenharmony_ci def bbox(self, index): 42587db96d56Sopenharmony_ci """Return a tuple of X1,Y1,X2,Y2 coordinates for a 42597db96d56Sopenharmony_ci rectangle which encloses the character given by index. 42607db96d56Sopenharmony_ci 42617db96d56Sopenharmony_ci The first two elements of the list give the x and y 42627db96d56Sopenharmony_ci coordinates of the upper-left corner of the screen 42637db96d56Sopenharmony_ci area covered by the character (in pixels relative 42647db96d56Sopenharmony_ci to the widget) and the last two elements give the 42657db96d56Sopenharmony_ci width and height of the character, in pixels. The 42667db96d56Sopenharmony_ci bounding box may refer to a region outside the 42677db96d56Sopenharmony_ci visible area of the window. 42687db96d56Sopenharmony_ci """ 42697db96d56Sopenharmony_ci return self._getints(self.tk.call(self._w, 'bbox', index)) or None 42707db96d56Sopenharmony_ci 42717db96d56Sopenharmony_ci def delete(self, first, last=None): 42727db96d56Sopenharmony_ci """Delete one or more elements of the spinbox. 42737db96d56Sopenharmony_ci 42747db96d56Sopenharmony_ci First is the index of the first character to delete, 42757db96d56Sopenharmony_ci and last is the index of the character just after 42767db96d56Sopenharmony_ci the last one to delete. If last isn't specified it 42777db96d56Sopenharmony_ci defaults to first+1, i.e. a single character is 42787db96d56Sopenharmony_ci deleted. This command returns an empty string. 42797db96d56Sopenharmony_ci """ 42807db96d56Sopenharmony_ci return self.tk.call(self._w, 'delete', first, last) 42817db96d56Sopenharmony_ci 42827db96d56Sopenharmony_ci def get(self): 42837db96d56Sopenharmony_ci """Returns the spinbox's string""" 42847db96d56Sopenharmony_ci return self.tk.call(self._w, 'get') 42857db96d56Sopenharmony_ci 42867db96d56Sopenharmony_ci def icursor(self, index): 42877db96d56Sopenharmony_ci """Alter the position of the insertion cursor. 42887db96d56Sopenharmony_ci 42897db96d56Sopenharmony_ci The insertion cursor will be displayed just before 42907db96d56Sopenharmony_ci the character given by index. Returns an empty string 42917db96d56Sopenharmony_ci """ 42927db96d56Sopenharmony_ci return self.tk.call(self._w, 'icursor', index) 42937db96d56Sopenharmony_ci 42947db96d56Sopenharmony_ci def identify(self, x, y): 42957db96d56Sopenharmony_ci """Returns the name of the widget at position x, y 42967db96d56Sopenharmony_ci 42977db96d56Sopenharmony_ci Return value is one of: none, buttondown, buttonup, entry 42987db96d56Sopenharmony_ci """ 42997db96d56Sopenharmony_ci return self.tk.call(self._w, 'identify', x, y) 43007db96d56Sopenharmony_ci 43017db96d56Sopenharmony_ci def index(self, index): 43027db96d56Sopenharmony_ci """Returns the numerical index corresponding to index 43037db96d56Sopenharmony_ci """ 43047db96d56Sopenharmony_ci return self.tk.call(self._w, 'index', index) 43057db96d56Sopenharmony_ci 43067db96d56Sopenharmony_ci def insert(self, index, s): 43077db96d56Sopenharmony_ci """Insert string s at index 43087db96d56Sopenharmony_ci 43097db96d56Sopenharmony_ci Returns an empty string. 43107db96d56Sopenharmony_ci """ 43117db96d56Sopenharmony_ci return self.tk.call(self._w, 'insert', index, s) 43127db96d56Sopenharmony_ci 43137db96d56Sopenharmony_ci def invoke(self, element): 43147db96d56Sopenharmony_ci """Causes the specified element to be invoked 43157db96d56Sopenharmony_ci 43167db96d56Sopenharmony_ci The element could be buttondown or buttonup 43177db96d56Sopenharmony_ci triggering the action associated with it. 43187db96d56Sopenharmony_ci """ 43197db96d56Sopenharmony_ci return self.tk.call(self._w, 'invoke', element) 43207db96d56Sopenharmony_ci 43217db96d56Sopenharmony_ci def scan(self, *args): 43227db96d56Sopenharmony_ci """Internal function.""" 43237db96d56Sopenharmony_ci return self._getints( 43247db96d56Sopenharmony_ci self.tk.call((self._w, 'scan') + args)) or () 43257db96d56Sopenharmony_ci 43267db96d56Sopenharmony_ci def scan_mark(self, x): 43277db96d56Sopenharmony_ci """Records x and the current view in the spinbox window; 43287db96d56Sopenharmony_ci 43297db96d56Sopenharmony_ci used in conjunction with later scan dragto commands. 43307db96d56Sopenharmony_ci Typically this command is associated with a mouse button 43317db96d56Sopenharmony_ci press in the widget. It returns an empty string. 43327db96d56Sopenharmony_ci """ 43337db96d56Sopenharmony_ci return self.scan("mark", x) 43347db96d56Sopenharmony_ci 43357db96d56Sopenharmony_ci def scan_dragto(self, x): 43367db96d56Sopenharmony_ci """Compute the difference between the given x argument 43377db96d56Sopenharmony_ci and the x argument to the last scan mark command 43387db96d56Sopenharmony_ci 43397db96d56Sopenharmony_ci It then adjusts the view left or right by 10 times the 43407db96d56Sopenharmony_ci difference in x-coordinates. This command is typically 43417db96d56Sopenharmony_ci associated with mouse motion events in the widget, to 43427db96d56Sopenharmony_ci produce the effect of dragging the spinbox at high speed 43437db96d56Sopenharmony_ci through the window. The return value is an empty string. 43447db96d56Sopenharmony_ci """ 43457db96d56Sopenharmony_ci return self.scan("dragto", x) 43467db96d56Sopenharmony_ci 43477db96d56Sopenharmony_ci def selection(self, *args): 43487db96d56Sopenharmony_ci """Internal function.""" 43497db96d56Sopenharmony_ci return self._getints( 43507db96d56Sopenharmony_ci self.tk.call((self._w, 'selection') + args)) or () 43517db96d56Sopenharmony_ci 43527db96d56Sopenharmony_ci def selection_adjust(self, index): 43537db96d56Sopenharmony_ci """Locate the end of the selection nearest to the character 43547db96d56Sopenharmony_ci given by index, 43557db96d56Sopenharmony_ci 43567db96d56Sopenharmony_ci Then adjust that end of the selection to be at index 43577db96d56Sopenharmony_ci (i.e including but not going beyond index). The other 43587db96d56Sopenharmony_ci end of the selection is made the anchor point for future 43597db96d56Sopenharmony_ci select to commands. If the selection isn't currently in 43607db96d56Sopenharmony_ci the spinbox, then a new selection is created to include 43617db96d56Sopenharmony_ci the characters between index and the most recent selection 43627db96d56Sopenharmony_ci anchor point, inclusive. 43637db96d56Sopenharmony_ci """ 43647db96d56Sopenharmony_ci return self.selection("adjust", index) 43657db96d56Sopenharmony_ci 43667db96d56Sopenharmony_ci def selection_clear(self): 43677db96d56Sopenharmony_ci """Clear the selection 43687db96d56Sopenharmony_ci 43697db96d56Sopenharmony_ci If the selection isn't in this widget then the 43707db96d56Sopenharmony_ci command has no effect. 43717db96d56Sopenharmony_ci """ 43727db96d56Sopenharmony_ci return self.selection("clear") 43737db96d56Sopenharmony_ci 43747db96d56Sopenharmony_ci def selection_element(self, element=None): 43757db96d56Sopenharmony_ci """Sets or gets the currently selected element. 43767db96d56Sopenharmony_ci 43777db96d56Sopenharmony_ci If a spinbutton element is specified, it will be 43787db96d56Sopenharmony_ci displayed depressed. 43797db96d56Sopenharmony_ci """ 43807db96d56Sopenharmony_ci return self.tk.call(self._w, 'selection', 'element', element) 43817db96d56Sopenharmony_ci 43827db96d56Sopenharmony_ci def selection_from(self, index): 43837db96d56Sopenharmony_ci """Set the fixed end of a selection to INDEX.""" 43847db96d56Sopenharmony_ci self.selection('from', index) 43857db96d56Sopenharmony_ci 43867db96d56Sopenharmony_ci def selection_present(self): 43877db96d56Sopenharmony_ci """Return True if there are characters selected in the spinbox, False 43887db96d56Sopenharmony_ci otherwise.""" 43897db96d56Sopenharmony_ci return self.tk.getboolean( 43907db96d56Sopenharmony_ci self.tk.call(self._w, 'selection', 'present')) 43917db96d56Sopenharmony_ci 43927db96d56Sopenharmony_ci def selection_range(self, start, end): 43937db96d56Sopenharmony_ci """Set the selection from START to END (not included).""" 43947db96d56Sopenharmony_ci self.selection('range', start, end) 43957db96d56Sopenharmony_ci 43967db96d56Sopenharmony_ci def selection_to(self, index): 43977db96d56Sopenharmony_ci """Set the variable end of a selection to INDEX.""" 43987db96d56Sopenharmony_ci self.selection('to', index) 43997db96d56Sopenharmony_ci 44007db96d56Sopenharmony_ci########################################################################### 44017db96d56Sopenharmony_ci 44027db96d56Sopenharmony_ci 44037db96d56Sopenharmony_ciclass LabelFrame(Widget): 44047db96d56Sopenharmony_ci """labelframe widget.""" 44057db96d56Sopenharmony_ci 44067db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 44077db96d56Sopenharmony_ci """Construct a labelframe widget with the parent MASTER. 44087db96d56Sopenharmony_ci 44097db96d56Sopenharmony_ci STANDARD OPTIONS 44107db96d56Sopenharmony_ci 44117db96d56Sopenharmony_ci borderwidth, cursor, font, foreground, 44127db96d56Sopenharmony_ci highlightbackground, highlightcolor, 44137db96d56Sopenharmony_ci highlightthickness, padx, pady, relief, 44147db96d56Sopenharmony_ci takefocus, text 44157db96d56Sopenharmony_ci 44167db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 44177db96d56Sopenharmony_ci 44187db96d56Sopenharmony_ci background, class, colormap, container, 44197db96d56Sopenharmony_ci height, labelanchor, labelwidget, 44207db96d56Sopenharmony_ci visual, width 44217db96d56Sopenharmony_ci """ 44227db96d56Sopenharmony_ci Widget.__init__(self, master, 'labelframe', cnf, kw) 44237db96d56Sopenharmony_ci 44247db96d56Sopenharmony_ci######################################################################## 44257db96d56Sopenharmony_ci 44267db96d56Sopenharmony_ci 44277db96d56Sopenharmony_ciclass PanedWindow(Widget): 44287db96d56Sopenharmony_ci """panedwindow widget.""" 44297db96d56Sopenharmony_ci 44307db96d56Sopenharmony_ci def __init__(self, master=None, cnf={}, **kw): 44317db96d56Sopenharmony_ci """Construct a panedwindow widget with the parent MASTER. 44327db96d56Sopenharmony_ci 44337db96d56Sopenharmony_ci STANDARD OPTIONS 44347db96d56Sopenharmony_ci 44357db96d56Sopenharmony_ci background, borderwidth, cursor, height, 44367db96d56Sopenharmony_ci orient, relief, width 44377db96d56Sopenharmony_ci 44387db96d56Sopenharmony_ci WIDGET-SPECIFIC OPTIONS 44397db96d56Sopenharmony_ci 44407db96d56Sopenharmony_ci handlepad, handlesize, opaqueresize, 44417db96d56Sopenharmony_ci sashcursor, sashpad, sashrelief, 44427db96d56Sopenharmony_ci sashwidth, showhandle, 44437db96d56Sopenharmony_ci """ 44447db96d56Sopenharmony_ci Widget.__init__(self, master, 'panedwindow', cnf, kw) 44457db96d56Sopenharmony_ci 44467db96d56Sopenharmony_ci def add(self, child, **kw): 44477db96d56Sopenharmony_ci """Add a child widget to the panedwindow in a new pane. 44487db96d56Sopenharmony_ci 44497db96d56Sopenharmony_ci The child argument is the name of the child widget 44507db96d56Sopenharmony_ci followed by pairs of arguments that specify how to 44517db96d56Sopenharmony_ci manage the windows. The possible options and values 44527db96d56Sopenharmony_ci are the ones accepted by the paneconfigure method. 44537db96d56Sopenharmony_ci """ 44547db96d56Sopenharmony_ci self.tk.call((self._w, 'add', child) + self._options(kw)) 44557db96d56Sopenharmony_ci 44567db96d56Sopenharmony_ci def remove(self, child): 44577db96d56Sopenharmony_ci """Remove the pane containing child from the panedwindow 44587db96d56Sopenharmony_ci 44597db96d56Sopenharmony_ci All geometry management options for child will be forgotten. 44607db96d56Sopenharmony_ci """ 44617db96d56Sopenharmony_ci self.tk.call(self._w, 'forget', child) 44627db96d56Sopenharmony_ci 44637db96d56Sopenharmony_ci forget = remove 44647db96d56Sopenharmony_ci 44657db96d56Sopenharmony_ci def identify(self, x, y): 44667db96d56Sopenharmony_ci """Identify the panedwindow component at point x, y 44677db96d56Sopenharmony_ci 44687db96d56Sopenharmony_ci If the point is over a sash or a sash handle, the result 44697db96d56Sopenharmony_ci is a two element list containing the index of the sash or 44707db96d56Sopenharmony_ci handle, and a word indicating whether it is over a sash 44717db96d56Sopenharmony_ci or a handle, such as {0 sash} or {2 handle}. If the point 44727db96d56Sopenharmony_ci is over any other part of the panedwindow, the result is 44737db96d56Sopenharmony_ci an empty list. 44747db96d56Sopenharmony_ci """ 44757db96d56Sopenharmony_ci return self.tk.call(self._w, 'identify', x, y) 44767db96d56Sopenharmony_ci 44777db96d56Sopenharmony_ci def proxy(self, *args): 44787db96d56Sopenharmony_ci """Internal function.""" 44797db96d56Sopenharmony_ci return self._getints( 44807db96d56Sopenharmony_ci self.tk.call((self._w, 'proxy') + args)) or () 44817db96d56Sopenharmony_ci 44827db96d56Sopenharmony_ci def proxy_coord(self): 44837db96d56Sopenharmony_ci """Return the x and y pair of the most recent proxy location 44847db96d56Sopenharmony_ci """ 44857db96d56Sopenharmony_ci return self.proxy("coord") 44867db96d56Sopenharmony_ci 44877db96d56Sopenharmony_ci def proxy_forget(self): 44887db96d56Sopenharmony_ci """Remove the proxy from the display. 44897db96d56Sopenharmony_ci """ 44907db96d56Sopenharmony_ci return self.proxy("forget") 44917db96d56Sopenharmony_ci 44927db96d56Sopenharmony_ci def proxy_place(self, x, y): 44937db96d56Sopenharmony_ci """Place the proxy at the given x and y coordinates. 44947db96d56Sopenharmony_ci """ 44957db96d56Sopenharmony_ci return self.proxy("place", x, y) 44967db96d56Sopenharmony_ci 44977db96d56Sopenharmony_ci def sash(self, *args): 44987db96d56Sopenharmony_ci """Internal function.""" 44997db96d56Sopenharmony_ci return self._getints( 45007db96d56Sopenharmony_ci self.tk.call((self._w, 'sash') + args)) or () 45017db96d56Sopenharmony_ci 45027db96d56Sopenharmony_ci def sash_coord(self, index): 45037db96d56Sopenharmony_ci """Return the current x and y pair for the sash given by index. 45047db96d56Sopenharmony_ci 45057db96d56Sopenharmony_ci Index must be an integer between 0 and 1 less than the 45067db96d56Sopenharmony_ci number of panes in the panedwindow. The coordinates given are 45077db96d56Sopenharmony_ci those of the top left corner of the region containing the sash. 45087db96d56Sopenharmony_ci pathName sash dragto index x y This command computes the 45097db96d56Sopenharmony_ci difference between the given coordinates and the coordinates 45107db96d56Sopenharmony_ci given to the last sash coord command for the given sash. It then 45117db96d56Sopenharmony_ci moves that sash the computed difference. The return value is the 45127db96d56Sopenharmony_ci empty string. 45137db96d56Sopenharmony_ci """ 45147db96d56Sopenharmony_ci return self.sash("coord", index) 45157db96d56Sopenharmony_ci 45167db96d56Sopenharmony_ci def sash_mark(self, index): 45177db96d56Sopenharmony_ci """Records x and y for the sash given by index; 45187db96d56Sopenharmony_ci 45197db96d56Sopenharmony_ci Used in conjunction with later dragto commands to move the sash. 45207db96d56Sopenharmony_ci """ 45217db96d56Sopenharmony_ci return self.sash("mark", index) 45227db96d56Sopenharmony_ci 45237db96d56Sopenharmony_ci def sash_place(self, index, x, y): 45247db96d56Sopenharmony_ci """Place the sash given by index at the given coordinates 45257db96d56Sopenharmony_ci """ 45267db96d56Sopenharmony_ci return self.sash("place", index, x, y) 45277db96d56Sopenharmony_ci 45287db96d56Sopenharmony_ci def panecget(self, child, option): 45297db96d56Sopenharmony_ci """Query a management option for window. 45307db96d56Sopenharmony_ci 45317db96d56Sopenharmony_ci Option may be any value allowed by the paneconfigure subcommand 45327db96d56Sopenharmony_ci """ 45337db96d56Sopenharmony_ci return self.tk.call( 45347db96d56Sopenharmony_ci (self._w, 'panecget') + (child, '-'+option)) 45357db96d56Sopenharmony_ci 45367db96d56Sopenharmony_ci def paneconfigure(self, tagOrId, cnf=None, **kw): 45377db96d56Sopenharmony_ci """Query or modify the management options for window. 45387db96d56Sopenharmony_ci 45397db96d56Sopenharmony_ci If no option is specified, returns a list describing all 45407db96d56Sopenharmony_ci of the available options for pathName. If option is 45417db96d56Sopenharmony_ci specified with no value, then the command returns a list 45427db96d56Sopenharmony_ci describing the one named option (this list will be identical 45437db96d56Sopenharmony_ci to the corresponding sublist of the value returned if no 45447db96d56Sopenharmony_ci option is specified). If one or more option-value pairs are 45457db96d56Sopenharmony_ci specified, then the command modifies the given widget 45467db96d56Sopenharmony_ci option(s) to have the given value(s); in this case the 45477db96d56Sopenharmony_ci command returns an empty string. The following options 45487db96d56Sopenharmony_ci are supported: 45497db96d56Sopenharmony_ci 45507db96d56Sopenharmony_ci after window 45517db96d56Sopenharmony_ci Insert the window after the window specified. window 45527db96d56Sopenharmony_ci should be the name of a window already managed by pathName. 45537db96d56Sopenharmony_ci before window 45547db96d56Sopenharmony_ci Insert the window before the window specified. window 45557db96d56Sopenharmony_ci should be the name of a window already managed by pathName. 45567db96d56Sopenharmony_ci height size 45577db96d56Sopenharmony_ci Specify a height for the window. The height will be the 45587db96d56Sopenharmony_ci outer dimension of the window including its border, if 45597db96d56Sopenharmony_ci any. If size is an empty string, or if -height is not 45607db96d56Sopenharmony_ci specified, then the height requested internally by the 45617db96d56Sopenharmony_ci window will be used initially; the height may later be 45627db96d56Sopenharmony_ci adjusted by the movement of sashes in the panedwindow. 45637db96d56Sopenharmony_ci Size may be any value accepted by Tk_GetPixels. 45647db96d56Sopenharmony_ci minsize n 45657db96d56Sopenharmony_ci Specifies that the size of the window cannot be made 45667db96d56Sopenharmony_ci less than n. This constraint only affects the size of 45677db96d56Sopenharmony_ci the widget in the paned dimension -- the x dimension 45687db96d56Sopenharmony_ci for horizontal panedwindows, the y dimension for 45697db96d56Sopenharmony_ci vertical panedwindows. May be any value accepted by 45707db96d56Sopenharmony_ci Tk_GetPixels. 45717db96d56Sopenharmony_ci padx n 45727db96d56Sopenharmony_ci Specifies a non-negative value indicating how much 45737db96d56Sopenharmony_ci extra space to leave on each side of the window in 45747db96d56Sopenharmony_ci the X-direction. The value may have any of the forms 45757db96d56Sopenharmony_ci accepted by Tk_GetPixels. 45767db96d56Sopenharmony_ci pady n 45777db96d56Sopenharmony_ci Specifies a non-negative value indicating how much 45787db96d56Sopenharmony_ci extra space to leave on each side of the window in 45797db96d56Sopenharmony_ci the Y-direction. The value may have any of the forms 45807db96d56Sopenharmony_ci accepted by Tk_GetPixels. 45817db96d56Sopenharmony_ci sticky style 45827db96d56Sopenharmony_ci If a window's pane is larger than the requested 45837db96d56Sopenharmony_ci dimensions of the window, this option may be used 45847db96d56Sopenharmony_ci to position (or stretch) the window within its pane. 45857db96d56Sopenharmony_ci Style is a string that contains zero or more of the 45867db96d56Sopenharmony_ci characters n, s, e or w. The string can optionally 45877db96d56Sopenharmony_ci contains spaces or commas, but they are ignored. Each 45887db96d56Sopenharmony_ci letter refers to a side (north, south, east, or west) 45897db96d56Sopenharmony_ci that the window will "stick" to. If both n and s 45907db96d56Sopenharmony_ci (or e and w) are specified, the window will be 45917db96d56Sopenharmony_ci stretched to fill the entire height (or width) of 45927db96d56Sopenharmony_ci its cavity. 45937db96d56Sopenharmony_ci width size 45947db96d56Sopenharmony_ci Specify a width for the window. The width will be 45957db96d56Sopenharmony_ci the outer dimension of the window including its 45967db96d56Sopenharmony_ci border, if any. If size is an empty string, or 45977db96d56Sopenharmony_ci if -width is not specified, then the width requested 45987db96d56Sopenharmony_ci internally by the window will be used initially; the 45997db96d56Sopenharmony_ci width may later be adjusted by the movement of sashes 46007db96d56Sopenharmony_ci in the panedwindow. Size may be any value accepted by 46017db96d56Sopenharmony_ci Tk_GetPixels. 46027db96d56Sopenharmony_ci 46037db96d56Sopenharmony_ci """ 46047db96d56Sopenharmony_ci if cnf is None and not kw: 46057db96d56Sopenharmony_ci return self._getconfigure(self._w, 'paneconfigure', tagOrId) 46067db96d56Sopenharmony_ci if isinstance(cnf, str) and not kw: 46077db96d56Sopenharmony_ci return self._getconfigure1( 46087db96d56Sopenharmony_ci self._w, 'paneconfigure', tagOrId, '-'+cnf) 46097db96d56Sopenharmony_ci self.tk.call((self._w, 'paneconfigure', tagOrId) + 46107db96d56Sopenharmony_ci self._options(cnf, kw)) 46117db96d56Sopenharmony_ci 46127db96d56Sopenharmony_ci paneconfig = paneconfigure 46137db96d56Sopenharmony_ci 46147db96d56Sopenharmony_ci def panes(self): 46157db96d56Sopenharmony_ci """Returns an ordered list of the child panes.""" 46167db96d56Sopenharmony_ci return self.tk.splitlist(self.tk.call(self._w, 'panes')) 46177db96d56Sopenharmony_ci 46187db96d56Sopenharmony_ci# Test: 46197db96d56Sopenharmony_ci 46207db96d56Sopenharmony_ci 46217db96d56Sopenharmony_cidef _test(): 46227db96d56Sopenharmony_ci root = Tk() 46237db96d56Sopenharmony_ci text = "This is Tcl/Tk version %s" % TclVersion 46247db96d56Sopenharmony_ci text += "\nThis should be a cedilla: \xe7" 46257db96d56Sopenharmony_ci label = Label(root, text=text) 46267db96d56Sopenharmony_ci label.pack() 46277db96d56Sopenharmony_ci test = Button(root, text="Click me!", 46287db96d56Sopenharmony_ci command=lambda root=root: root.test.configure( 46297db96d56Sopenharmony_ci text="[%s]" % root.test['text'])) 46307db96d56Sopenharmony_ci test.pack() 46317db96d56Sopenharmony_ci root.test = test 46327db96d56Sopenharmony_ci quit = Button(root, text="QUIT", command=root.destroy) 46337db96d56Sopenharmony_ci quit.pack() 46347db96d56Sopenharmony_ci # The following three commands are needed so the window pops 46357db96d56Sopenharmony_ci # up on top on Windows... 46367db96d56Sopenharmony_ci root.iconify() 46377db96d56Sopenharmony_ci root.update() 46387db96d56Sopenharmony_ci root.deiconify() 46397db96d56Sopenharmony_ci root.mainloop() 46407db96d56Sopenharmony_ci 46417db96d56Sopenharmony_ci 46427db96d56Sopenharmony_ci__all__ = [name for name, obj in globals().items() 46437db96d56Sopenharmony_ci if not name.startswith('_') and not isinstance(obj, types.ModuleType) 46447db96d56Sopenharmony_ci and name not in {'wantobjects'}] 46457db96d56Sopenharmony_ci 46467db96d56Sopenharmony_ciif __name__ == '__main__': 46477db96d56Sopenharmony_ci _test() 4648