Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 34k
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:
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.