-
-
Notifications
You must be signed in to change notification settings - Fork 30.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
gh-124111: Update tkinter for compatibility with Tcl/Tk 9.0.0 #124156
Conversation
Most changes to Python require a NEWS entry. Add one using the blurb_it web app or the blurb command-line tool. If this change has little impact on Python users, wait for a maintainer to apply the |
This comment was marked as duplicate.
This comment was marked as duplicate.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you know why your generated files look like they're completely changed? It is line endings being bad? (I believe our regen scripts assume you're using autocrlf on Windows.)
I have no idea. I committed those by mistake, since I am used to using git commit -a. It has something to do with Windows - those files were not changed by other platforms. I think I have now restored the autogenerated files that I committed by mistake. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looking good! I have some comments that are mostly style nits, and I think we may want to hold off on the changes to PCbuild/
. I don't think we'll be able to move the Windows builds for <=3.13 to Tcl/Tk 9 (at least not immediately), so it will make backporting the other changes easier to leave the 3.14 PCbuild/
updates to a separate PR.
Thanks!
…pped and _no_round.
I think I have now addressed all issues raised in the comments. Is there anything else that is needed? |
8072c54
to
ec56443
Compare
We don't want example files in the build directory. To "save" the changes for later, they could either be a draft PR, comments in the file (not preferred), or you could add the changes with Footnotes
|
Sure. I will attempt to modify _tkinter.vcxproj to allow building against either 8.6.14 or 9.0.0. (Note that 8.6.15 has been released, but the binaries are not available to get_externals.bat yet.) |
…ersion by setting the TclVersion environment variable
I think this PR is finished. The PR checks test against Tcl/Tk 8.6.14, and they are showing no failures. I have tested against Tcl/Tk 8.6.15 and Tcl/Tk 9.0.0 (rc2) on my own machines, running Ubuntu 22.04, Windows 11, and macOS 14. There are no failures in those 6 cases. The issue reported in #124378 with 8.6.15 has been resolved here. The release of Tcl/Tk 9.0.0 is expected within a week, and surely will happen by the end of next week. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is great, thank you! I'm satisfied with this change overall, but I think we should get a once-over from @serhiy-storchaka for the tkinter changes and a final confirmation from @zooba that the PCbuild/
changes match his expectations.
With your permission, I'd like to extract your ttk Notebook test fixes to a separate PR so that we can go ahead with it and get it backported. (If you would prefer to make that split yourself, that works for me.)
I expect that we will eventually be backporting this whole PR even if we don't start shipping 9.0 with our <3.14 binaries because at some point our non-Windows CI systems will inevitably update to 9.0, but I'm not sure how quickly that will happen and want to be sure we get 8.6.15 supported as soon as we can.
Lib/test/test_tkinter/support.py
Outdated
@@ -112,6 +113,10 @@ def get_tk_patchlevel(root): | |||
def pixels_conv(value): | |||
return float(value[:-1]) * units[value[-1:]] | |||
|
|||
pix_re = re.compile(r'[0-9]*\.?[0-9]*[cimp]{1}') | |||
def is_pixel_str(x): | |||
return pix_re.fullmatch(x) != None |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: this doesn't seem to be used anymore.
Thanks! That sounds good,
By all means. I would prefer to have you handle the split.
Great! |
According to this email the release of Tcl/Tk 9.0.0.0 will happen tomorrow. Addendum: Tcl/Tk 9.0.0.0 were in fact released today 2/26/2024 as scheduled. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Along with the MSI changes (and possibly under PC/layout as well, I haven't checked), we need to make sure that we're okay with redistributing libtommath.dll and also that there isn't a static linking option for it. zlib unfortunately causes us trouble, but static linking here is impossible (because Tcl/Tk doesn't allow for it in their build scripts - I suspect the same will apply to tommath).
I'm okay with merging without the MSI changes, but we then cannot update any releases until it's done. As annoying as it is for backports, I'd require a comment in get_externals.bat to this effect.
@@ -17,15 +17,20 @@ | |||
<tcltkDir Condition="$(tcltkDir) == ''">$(ExternalsDir)tcltk-$(TclVersion)\$(ArchName)\</tcltkDir> | |||
<tclWin32Exe Condition="$(Platform) == 'Win32'">$(tcltkDir)\bin\tclsh$(TclMajorVersion)$(TclMinorVersion)t.exe</tclWin32Exe> | |||
<tclWin32Exe Condition="$(Platform) != 'Win32'">$(tcltkDir)\..\win32\bin\tclsh$(TclMajorVersion)$(TclMinorVersion)t.exe</tclWin32Exe> | |||
<tclExternalTommath Condition="$(TclMajorVersion) == '9'">TCL_WITH_EXTERNAL_TOMMATH;</tclExternalTommath> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is not used anywhere, just remove it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actually, the TCL_WITH_EXTERNAL_TOMMATH constant is used when building against TclTk 9.0; although it is not used by 8.6. With 9.0, if it is not defined then all of the symbols defined in libtommath.dll are reported by the linker as being undefined. I believe that this is related to how the Tcl stubs library works; it is not a straightforward linker error since libtommath.dll is being passed to the linker.
One might hope that the existence of a constant named TCL_WITH_EXTERNAL_TOMMATH indicates that one could choose not to have an external libtommath.dlll and instead arrange for libtommath to be statically linked into libtcl.dll, as is the case with Tcl 8.6. However, I was not able to find a combination of build options which accomplished that. I will try to find out if it is possible.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@zooba: As far as I can tell. the following command uses MSVC to build a static library tcl90s.lib which has both zlib and (part of) libtommath built-in:
nmake -f makefile.vc TCL_WITH_INTERNAL_ZLIB=1 TCL_WITH_EXTERNAL_TOMMATH=0 STATIC_BUILD=1
According to dumpbin, the tclsh90s.exe executable built by that command does not have libtommath.dll or zlib.dll as dependencies. So presumably the same would be true of the _tkinter extension if it were linked against tcl90s.lib.
If you are willing to use gcc in msys64 then configure --disable-static
seems to do the equivalent thing.
Reference: https://core.tcl-lang.org/tips/doc/trunk/tip/538.md
It's not really the place to call out TclVersion particularly. We probably should have a note about environment variables somewhere, but I don't have a good wording for it at the moment. We can add that later on.
Big applause to Marc for this big bunch of work. I am sure, the TkInter community will enjoy tk 9.0, as it has a better look and scaling ability of the whole gui. |
GH-127364 is a backport of this pull request to the 3.13 branch. |
…ythonGH-124156) (cherry picked from commit 47cbf03)
I propose to backport this change to Python 3.13, see: #127364. See the discussion on the issue for the backport rationale. |
This PR updates tkinter, ttk, test.test_tkinter and test.test_ttk to make them work and pass tests when built against either TclTk 8.6.15, which was released today, or TclTk 9.0.0 which currently has a release candidate and will be released soon. The changes to the tests include some re-organization to make it easier to accommodate expected development of Tk 9, particularly with respect to the new TclObject of type "pixels" used in Tk 9 for options whose values represent screen distances.
Please also see the discussion on PR #124112.
Note that, unlike #124112, this PR targets Python 3.14.