Description
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:
import tkinter as tk
root = tk.Tk()
print(type(root.cget("padx")))
_ = str(root.cget("padx")) # should really not cause any side effects
print(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.