Introduced in #16545
Affects Python 3.7+ on Windows only
The FromObj function in _tkinter.c attempt to convert a Tcl_Obj to an equivalent Python object if possible, and otherwise returns a _tkinter.Tcl_Obj with the typename attribute set to the original object's type.
However, on Windows, accessing the resulting object's string representation calls Tcl_GetUnicodeFromObj, which converts the Tcl_Obj to a String. This side effect isn't mentioned in the Tcl documentation, but is in the Tcl source code. As a result, retrieving the same tk property afterwards will return a Python string instead.
Minimal example:
importtkinterastkroot=tk.Tk()
print(type(root.cget("padx")))
_=str(root.cget("padx")) # should really not cause any side effectsprint(type(root.cget("padx")))
# Windows:# <class '_tkinter.Tcl_Obj'># <class 'str'># Other platforms:# <class '_tkinter.Tcl_Obj'># <class '_tkinter.Tcl_Obj'>
Possible solutions: unicodeFromTclObj should copy the object before passing calling Tcl_GetUnicodeFromObj, or handle Unicode without it like on other platforms.
The text was updated successfully, but these errors were encountered:
Introduced in #16545
Affects Python 3.7+ on Windows only
The
FromObj
function in_tkinter.c
attempt to convert aTcl_Obj
to an equivalent Python object if possible, and otherwise returns a_tkinter.Tcl_Obj
with thetypename
attribute set to the original object's type.However, on Windows, accessing the resulting object's string representation calls
Tcl_GetUnicodeFromObj
, which converts theTcl_Obj
to aString
. This side effect isn't mentioned in the Tcl documentation, but is in the Tcl source code. As a result, retrieving the same tk property afterwards will return a Python string instead.Minimal example:
Possible solutions:
unicodeFromTclObj
should copy the object before passing callingTcl_GetUnicodeFromObj
, or handle Unicode without it like on other platforms.The text was updated successfully, but these errors were encountered: