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).
Linked PRs
When
wantobjectsis enabled (the default),_tkinterconverts 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 asTcl_Objeven though a natural Python type exists, which forces callers to wrap results instr(),getint(), etc.Proposal: convert a few more object types in
FromObj().strfor 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-orientor-state)window(e.g. the value of-labelwidget)nsName(a namespace name)parsedVarName(e.g. the value of-variable)An
indexvalue is always one of a small fixed set of keywords, so the resultingstris interned — equal keywords share a single object, saving memory and speeding up==and dict lookups.int/floatfor thepixeltype (a screen distance): a value with no unit suffix is already in pixels and screen-independent, so it is returned as anintorfloat. A value with anm/c/i/psuffix depends on the screen resolution and needs aTk_Windowto resolve, which is not available inFromObj(), so it is kept as aTcl_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 astr.Notes / compatibility:
wantobjects); with objects disabled everything is alreadystr.cgeton Tk < 9 eagerly resolves a unit-bearing screen distance to an integer pixel count, so the "unit-bearing distance stays aTcl_Obj" behavior is Tk 9.0+ only; and thensNameobject type exists only on Tk 9.0+ (on 8.xnamespace currentis a plain string — stillstr).Linked PRs