You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
tkinter: return str and numbers for more Tcl object types #153513
When wantobjects is enabled (the default), _tkinter converts values returned from Tcl/Tk to the equivalent Python type where one exists (bool, int, float, bytes, str, tuple) and wraps everything else in an opaque _tkinter.Tcl_Obj. Several common Tcl object types are still returned as Tcl_Obj even though a natural Python type exists, which forces callers to wrap results in str(), getint(), etc.
Proposal: convert a few more object types in FromObj().
str for types whose internal representation is only a throwaway, context-bound lookup with nothing worth preserving for a round-trip back to Tcl:
index (an enumeration keyword, e.g. the value of -orient or -state)
window (e.g. the value of -labelwidget)
nsName (a namespace name)
parsedVarName (e.g. the value of -variable)
An index value is always one of a small fixed set of keywords, so the resulting str is interned — equal keywords share a single object, saving memory and speeding up == and dict lookups.
int/float for the pixel type (a screen distance): a value with no unit suffix is already in pixels and screen-independent, so it is returned as an int or float. A value with an m/c/i/p suffix depends on the screen resolution and needs a Tk_Window to resolve, which is not available in FromObj(), so it is kept as a Tcl_Obj.
Deliberately left as Tcl_Obj:
color, border, font, cursor — their internal representation caches an allocated X/font resource that Tk reuses when the object is passed back, so wrapping preserves a real performance benefit.
dict — a structured value, best consumed with _splitdict() rather than flattened to a str.
Notes / compatibility:
Only affects the object mode (wantobjects); with objects disabled everything is already str.
The set of types that actually surface is identical across Tcl/Tk 8.6, 8.7, 9.0 and 9.1 (verified). The only cross-version difference is that classic-widget cget on Tk < 9 eagerly resolves a unit-bearing screen distance to an integer pixel count, so the "unit-bearing distance stays a Tcl_Obj" behavior is Tk 9.0+ only; and the nsName object type exists only on Tk 9.0+ (on 8.x namespace current is a plain string — still str).
Activity
gh-153513: Return str and numbers for more Tcl object types in _tkint…
gh-153513: Remove redundant conversions in tkinter tests (GH-153520)
gh-153513: Remove obsolete Tk version guards in tkinter tests (GH-153615