gh-156961: Fix tkinter.font.Font for a font name returned as a Tcl object - #157028
Conversation
…Tcl object
Tk can return a font name or description as a Tcl object, for example
from ttk.Style().lookup("TButton", "font"), Menu.entrycget("font"),
ttk.Entry.cget("font"), or the default value in the result of
configure(). Such an object does not compare equal to a string, so it
was not recognized as the name of an existing named font. Keep it as
is, so that it is passed back to Tk, and only convert it where it is
compared with a string.
|
Thanks @serhiy-storchaka for the PR 🌮🎉.. I'm working now to backport this PR to: 3.13, 3.14, 3.15. |
|
Sorry, @serhiy-storchaka, I could not cleanly backport this to |
|
Sorry, @serhiy-storchaka, I could not cleanly backport this to |
|
Sorry, @serhiy-storchaka, I could not cleanly backport this to |
|
GH-157403 is a backport of this pull request to the 3.15 branch. |
|
GH-157404 is a backport of this pull request to the 3.14 branch. |
|
GH-157405 is a backport of this pull request to the 3.13 branch. |
… Tcl object (GH-157028) (GH-157405) Tk can return a font name as a Tcl object, for example from ttk.Style().lookup("TButton", "font"), Menu.entrycget("font"), ttk.Entry.cget("font"), or the default value in the result of configure(). Such an object does not compare equal to a string, so it was not recognized as the name of an existing named font. Keep it as is, so that it is passed back to Tk, and only convert it where it is compared with a string. (cherry picked from commit 62cbd34)
… Tcl object (GH-157028) (GH-157404) Tk can return a font name as a Tcl object, for example from ttk.Style().lookup("TButton", "font"), Menu.entrycget("font"), ttk.Entry.cget("font"), or the default value in the result of configure(). Such an object does not compare equal to a string, so it was not recognized as the name of an existing named font. Keep it as is, so that it is passed back to Tk, and only convert it where it is compared with a string. (cherry picked from commit 62cbd34)
Tk can return a font name or description as a Tcl object rather than a string, for example from
ttk.Style().lookup("TButton", "font"),Menu.entrycget("font"),ttk.Entry.cget("font"), or the default value in the result ofconfigure(). Such an object does not compare equal to a string, so it was not recognized as the name of an existing named font, and the code from the issue failed withTclError: named font TkDefaultFont does not already exist. Wrapping a font description also failed, withTypeError: '_tkinter.Tcl_Obj' object is not iterable.The object is now kept as is, so that it is passed back to Tk, which reuses the font resource cached in it (this is why
FromObj()does not convert fonts to strings, see gh-153513). It is only converted where it is compared with a string.Tested with Tcl/Tk 8.6.17, 8.7b1, 9.0.4 and 9.1b1, with and without
wantobjects.The backports to 3.15, 3.14 and 3.13 need to be made manually: these branches have no wrapped font descriptions (gh-143990), so
Font.nameis always a string there and__str__needs a different fix.🤖 Generated with Claude Code