Skip to content
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

Merged
merged 30 commits into from
Nov 14, 2024

Conversation

culler
Copy link
Contributor

@culler culler commented Sep 17, 2024

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.

@bedevere-app
Copy link

bedevere-app bot commented Sep 17, 2024

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 skip news label instead.

@bedevere-app

This comment was marked as duplicate.

@culler culler requested a review from a team as a code owner September 19, 2024 16:11
Copy link
Member

@zooba zooba left a 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.)

PCbuild/tcltk.props Outdated Show resolved Hide resolved
PCbuild/tcltk.props Outdated Show resolved Hide resolved
@culler
Copy link
Contributor Author

culler commented Sep 19, 2024

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.

Copy link
Member

@zware zware left a 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!

Lib/test/test_tkinter/test_misc.py Outdated Show resolved Hide resolved
Lib/test/test_tkinter/test_widgets.py Outdated Show resolved Hide resolved
Lib/test/test_tkinter/widget_tests.py Outdated Show resolved Hide resolved
Lib/test/test_ttk/test_widgets.py Outdated Show resolved Hide resolved
@culler
Copy link
Contributor Author

culler commented Sep 20, 2024

I think I have now addressed all issues raised in the comments. Is there anything else that is needed?

@culler culler requested a review from zware September 20, 2024 16:38
@zooba
Copy link
Member

zooba commented Sep 23, 2024

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 Condition="$(TclMajorVersion) == '9'" checks so that they automatically apply when building against 9.0 (preferred).1

Footnotes

  1. Number comparisons are a bit wonky in MSBuild, so usually just best to pick the most sensible default. In this case, it's probably actually to check $(TclMajorVersion) == '8' for the old behaviour, so that when 10.0 comes out it'll get the newer behaviours.

@culler
Copy link
Contributor Author

culler commented Sep 23, 2024

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 Condition="$(TclMajorVersion) == '9'" checks so that they automatically apply when building against 9.0 (preferred).1

Footnotes

1. Number comparisons are a bit wonky in MSBuild, so usually just best to pick the most sensible default. In this case, it's probably actually to check `$(TclMajorVersion) == '8'` for the old behaviour, so that when 10.0 comes out it'll get the newer behaviours. [↩](#user-content-fnref-1-9d9cf4f3af8602fa729bad031ef1ba2c)

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.)

@culler
Copy link
Contributor Author

culler commented Sep 25, 2024

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.

Copy link
Member

@zware zware left a 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/test_misc.py Outdated Show resolved Hide resolved
@@ -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
Copy link
Member

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.

@culler
Copy link
Contributor Author

culler commented Sep 25, 2024

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.

Thanks! That sounds good,

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.)

By all means. I would prefer to have you handle the split.

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.

Great!

@culler
Copy link
Contributor Author

culler commented Sep 25, 2024

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.

Copy link
Member

@zooba zooba left a 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.

PCbuild/_tkinter.vcxproj Outdated Show resolved Hide resolved
PCbuild/tcltk.props Outdated Show resolved Hide resolved
@@ -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>
Copy link
Member

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.

Copy link
Contributor Author

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.

Copy link
Contributor Author

@culler culler Sep 30, 2024

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

culler and others added 5 commits September 29, 2024 13:36
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.
@zware zware changed the title gh-124111 Update tkinter to use TclTk 8.6.15 or 9.0.0 gh-124111: Update tkinter for compatibility with Tcl/Tk 9.0.0 Nov 14, 2024
@zware zware merged commit 47cbf03 into python:main Nov 14, 2024
39 checks passed
@oehhar
Copy link

oehhar commented Nov 15, 2024

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.
Harald with greeting from the Tcl/Tk team !

@bedevere-app
Copy link

bedevere-app bot commented Nov 28, 2024

GH-127364 is a backport of this pull request to the 3.13 branch.

vstinner pushed a commit to vstinner/cpython that referenced this pull request Nov 28, 2024
@vstinner
Copy link
Member

I propose to backport this change to Python 3.13, see: #127364.

See the discussion on the issue for the backport rationale.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants