Skip to content

Update tkinter to use Tk 8.6.15 or (better) Tk 9.0 #124111

Closed

Description

@culler

Feature or enhancement

Proposal:

This issue is being opened as a prerequisite for a PR which will update _tkinter.c and Lib/test/test_tkinter so that they work with both Tk 8.6.15 and Tk 9.0.

Both Tk 8.6.15 and Tk 9.0 currently have release candidates available and will be released soon. The TclTk project has decided that there will be no release of the 8.7 branches. Tcl 9 and Tk 9 are the current development branches (both named main in the fossil repository.)

Tk 9 offers many improvements over Tk 8, and both TclTk and Python would benefit from having tkinter support for Tk 9.0.

Has this already been discussed elsewhere?

No response given

Links to previous discussion of this feature:

No response

Linked PRs

Activity

  1. added a commit that references this issue on Nov 28, 2024
  2. vstinner commented on Nov 28, 2024

    @vstinner
    Member

    I'm interested by a backport of the change 47cbf03 to 3.12 and 3.13 branches. In Fedora Rawhide, we have Tcl/Tk 9 and Python 3.12 and 3.13. It would be nice to support recent Tcl/Tk in stable Python versions.

    I started by creating PR gh-127364 which is a simple backport from main to 3.13 branch: there is no merge conflict!

    cc @hroncok

  3. added a commit that references this issue on Dec 8, 2024
  4. cho-m commented on Dec 19, 2024

    @cho-m
    Contributor

    With TCL 9, CPython's _tkinter.c thread support detection doesn't seem to work:

    cpython/Modules/_tkinter.c

    Lines 586 to 587 in f802c8b

    v->threaded = Tcl_GetVar2Ex(v->interp, "tcl_platform", "threaded",
    TCL_GLOBAL_ONLY) != NULL;

    I'm guessing this is due to documented TCL change:

    • No --disable-threads build option. Always thread-enabled.

    Current (main) _tkinter.c code causes crashes when mixing threading and tkinter probably from TCL APIs executed on the wrong thread.

    Crash goes away by forcing v->threaded = 1; with TCL_MAJOR_VERSION >= 9 (or TK_MAJOR_VERSION >= 9).

  5. added a commit that references this issue on Dec 19, 2024
  6. added a commit that references this issue on Jan 12, 2025
  7. added 3 commits that reference this issue on Apr 7, 2025
  8. added 2 commits that reference this issue on Apr 7, 2025
  9. added 2 commits that reference this issue on Apr 7, 2025
  10. aivarannamaa commented on May 6, 2025

    @aivarannamaa
    Contributor

    Any idea, whether Tk 9.0.1 will appear in Python 3.14 official builds?

  11. ned-deily commented on Jul 22, 2025

    @ned-deily
    Member

    Now that Tk 9.0.2 has been released, I have built and tested a macOS Python with it using the current main (3.15) branch (on a current macOS Sequoia 15.5 Apple Silicon system). I'm seeing 25 failures (a number appear to be the same failure just with different widgets). The current 3.14 branch (just prior to rc1) gives similar results. FTR, 3.13 has many more failures as the original fixes for Tk 9 have not been backported. I have not tested on any other platforms. Tcl and Tk were built on macOS 15.5 with CFLAGS="-mmacosx-version-min=10.15 -arch arm64 -arch x86_64" .

    At the moment, our GitHub CI tests for macOS are pinned to the current Homebrew tcl-tk@8 package, currently 8.6.16, avoiding this issue. AFAICT, most of our CI runs and buildbots build with Tk 8.6, a few with 9, but very few of any of them actually execute the GUI tests on any platform; the macOS build and test (macos-13) CI job is one that does execute them. It would be good if more did.

    The failing test cases in alphabetical order:

    test_configure_borderwidth (test.test_tkinter.test_widgets.MenubuttonTest.test_configure_borderwidth) ... FAIL
    test_configure_borderwidth (test.test_tkinter.test_widgets.OptionMenuTest.test_configure_borderwidth) ... FAIL
    test_configure_borderwidth (test.test_tkinter.test_widgets.TextTest.test_configure_borderwidth) ... FAIL
    test_configure_height (test.test_tkinter.test_widgets.ButtonTest.test_configure_height) ... FAIL
    test_configure_height (test.test_tkinter.test_widgets.CheckbuttonTest.test_configure_height) ... FAIL
    test_configure_height (test.test_tkinter.test_widgets.LabelTest.test_configure_height) ... FAIL
    test_configure_height (test.test_tkinter.test_widgets.MenubuttonTest.test_configure_height) ... FAIL
    test_configure_height (test.test_tkinter.test_widgets.OptionMenuTest.test_configure_height) ... FAIL
    test_configure_height (test.test_tkinter.test_widgets.RadiobuttonTest.test_configure_height) ... FAIL
    test_configure_height (test.test_tkinter.test_widgets.TextTest.test_configure_height) ... FAIL
    test_configure_insertborderwidth (test.test_tkinter.test_widgets.CanvasTest.test_configure_insertborderwidth) ... FAIL
    test_configure_insertborderwidth (test.test_tkinter.test_widgets.TextTest.test_configure_insertborderwidth) ... FAIL
    test_configure_insertwidth (test.test_tkinter.test_widgets.CanvasTest.test_configure_insertwidth) ... FAIL
    test_configure_insertwidth (test.test_tkinter.test_widgets.TextTest.test_configure_insertwidth) ... FAIL
    test_configure_padx (test.test_tkinter.test_widgets.TextTest.test_configure_padx) ... FAIL
    test_configure_pady (test.test_tkinter.test_widgets.TextTest.test_configure_pady) ... FAIL
    test_configure_selectborderwidth (test.test_tkinter.test_widgets.CanvasTest.test_configure_selectborderwidth) ... FAIL
    test_configure_selectborderwidth (test.test_tkinter.test_widgets.TextTest.test_configure_selectborderwidth) ... FAIL
    test_configure_values (test.test_tkinter.test_widgets.SpinboxTest.test_configure_values) ... FAIL
    test_configure_width (test.test_tkinter.test_widgets.ButtonTest.test_configure_width) ... FAIL
    test_configure_width (test.test_tkinter.test_widgets.CheckbuttonTest.test_configure_width) ... FAIL
    test_configure_width (test.test_tkinter.test_widgets.LabelTest.test_configure_width) ... FAIL
    test_configure_width (test.test_tkinter.test_widgets.MenubuttonTest.test_configure_width) ... FAIL
    test_configure_width (test.test_tkinter.test_widgets.OptionMenuTest.test_configure_width) ... FAIL
    test_configure_width (test.test_tkinter.test_widgets.RadiobuttonTest.test_configure_width) ... FAIL
    
    

    and the detailed test failures:

    ======================================================================
    FAIL: test_configure_height (test.test_tkinter.test_widgets.ButtonTest.test_configure_height)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 549, in test_configure_height
        self.checkIntegerParam(widget, 'height', 100, -100, 0)
        ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 81, in checkIntegerParam
        self.checkParams(widget, name, *values, **kwargs)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 78, in checkParams
        self.checkParam(widget, name, value, **kwargs)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -100
    
    ======================================================================
    FAIL: test_configure_width (test.test_tkinter.test_widgets.ButtonTest.test_configure_width)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 553, in test_configure_width
        self.checkIntegerParam(widget, 'width', 402, -402, 0)
        ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 81, in checkIntegerParam
        self.checkParams(widget, name, *values, **kwargs)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 78, in checkParams
        self.checkParam(widget, name, value, **kwargs)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -402
    
    ======================================================================
    FAIL: test_configure_insertborderwidth (test.test_tkinter.test_widgets.CanvasTest.test_configure_insertborderwidth)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 263, in test_configure_insertborderwidth
        self.checkPixelsParam(widget, 'insertborderwidth',
        ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              0, 1.3, 2.6, 6, '10p')
                              ^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 159, in checkPixelsParam
        self.checkParam(widget, name, value, expected=expected,
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                        conv=conv1, **kwargs)
                        ^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: '1.3' != '1'
    - 1.3
    + 1
    
    
    ======================================================================
    FAIL: test_configure_insertwidth (test.test_tkinter.test_widgets.CanvasTest.test_configure_insertwidth)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 269, in test_configure_insertwidth
        self.checkPixelsParam(widget, 'insertwidth', 1.3, 2.6, -2, '10p')
        ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 159, in checkPixelsParam
        self.checkParam(widget, name, value, expected=expected,
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                        conv=conv1, **kwargs)
                        ^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: '1.3' != '1'
    - 1.3
    + 1
    
    
    ======================================================================
    FAIL: test_configure_selectborderwidth (test.test_tkinter.test_widgets.CanvasTest.test_configure_selectborderwidth)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 283, in test_configure_selectborderwidth
        self.checkPixelsParam(widget, 'selectborderwidth', 1.3, 2.6, -2, '10p')
        ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 159, in checkPixelsParam
        self.checkParam(widget, name, value, expected=expected,
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                        conv=conv1, **kwargs)
                        ^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: '1.3' != '1'
    - 1.3
    + 1
    
    
    ======================================================================
    FAIL: test_configure_height (test.test_tkinter.test_widgets.CheckbuttonTest.test_configure_height)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 549, in test_configure_height
        self.checkIntegerParam(widget, 'height', 100, -100, 0)
        ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 81, in checkIntegerParam
        self.checkParams(widget, name, *values, **kwargs)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 78, in checkParams
        self.checkParam(widget, name, value, **kwargs)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -100
    
    ======================================================================
    FAIL: test_configure_width (test.test_tkinter.test_widgets.CheckbuttonTest.test_configure_width)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 553, in test_configure_width
        self.checkIntegerParam(widget, 'width', 402, -402, 0)
        ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 81, in checkIntegerParam
        self.checkParams(widget, name, *values, **kwargs)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 78, in checkParams
        self.checkParam(widget, name, value, **kwargs)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -402
    
    ======================================================================
    FAIL: test_configure_height (test.test_tkinter.test_widgets.LabelTest.test_configure_height)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 549, in test_configure_height
        self.checkIntegerParam(widget, 'height', 100, -100, 0)
        ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 81, in checkIntegerParam
        self.checkParams(widget, name, *values, **kwargs)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 78, in checkParams
        self.checkParam(widget, name, value, **kwargs)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -100
    
    ======================================================================
    FAIL: test_configure_width (test.test_tkinter.test_widgets.LabelTest.test_configure_width)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 553, in test_configure_width
        self.checkIntegerParam(widget, 'width', 402, -402, 0)
        ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 81, in checkIntegerParam
        self.checkParams(widget, name, *values, **kwargs)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 78, in checkParams
        self.checkParam(widget, name, value, **kwargs)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -402
    
    ======================================================================
    FAIL: test_configure_borderwidth (test.test_tkinter.test_widgets.MenubuttonTest.test_configure_borderwidth)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 250, in test_configure_borderwidth
        self.checkParam(widget, 'borderwidth', -2)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -2
    
    ======================================================================
    FAIL: test_configure_height (test.test_tkinter.test_widgets.MenubuttonTest.test_configure_height)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/test_widgets.py", line 318, in test_configure_height
        self.checkIntegerParam(widget, 'height', 100, -100, 0, conv=str)
        ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 81, in checkIntegerParam
        self.checkParams(widget, name, *values, **kwargs)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 78, in checkParams
        self.checkParam(widget, name, value, **kwargs)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 100 != '100'
    
    ======================================================================
    FAIL: test_configure_width (test.test_tkinter.test_widgets.MenubuttonTest.test_configure_width)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/test_widgets.py", line 345, in test_configure_width
        self.checkIntegerParam(widget, 'width', 402, -402, 0, conv=str)
        ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 81, in checkIntegerParam
        self.checkParams(widget, name, *values, **kwargs)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 78, in checkParams
        self.checkParam(widget, name, value, **kwargs)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 402 != '402'
    
    ======================================================================
    FAIL: test_configure_borderwidth (test.test_tkinter.test_widgets.OptionMenuTest.test_configure_borderwidth)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 250, in test_configure_borderwidth
        self.checkParam(widget, 'borderwidth', -2)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -2
    
    ======================================================================
    FAIL: test_configure_height (test.test_tkinter.test_widgets.OptionMenuTest.test_configure_height)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/test_widgets.py", line 318, in test_configure_height
        self.checkIntegerParam(widget, 'height', 100, -100, 0, conv=str)
        ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 81, in checkIntegerParam
        self.checkParams(widget, name, *values, **kwargs)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 78, in checkParams
        self.checkParam(widget, name, value, **kwargs)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 100 != '100'
    
    ======================================================================
    FAIL: test_configure_width (test.test_tkinter.test_widgets.OptionMenuTest.test_configure_width)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/test_widgets.py", line 345, in test_configure_width
        self.checkIntegerParam(widget, 'width', 402, -402, 0, conv=str)
        ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 81, in checkIntegerParam
        self.checkParams(widget, name, *values, **kwargs)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 78, in checkParams
        self.checkParam(widget, name, value, **kwargs)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 402 != '402'
    
    ======================================================================
    FAIL: test_configure_height (test.test_tkinter.test_widgets.RadiobuttonTest.test_configure_height)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 549, in test_configure_height
        self.checkIntegerParam(widget, 'height', 100, -100, 0)
        ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 81, in checkIntegerParam
        self.checkParams(widget, name, *values, **kwargs)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 78, in checkParams
        self.checkParam(widget, name, value, **kwargs)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -100
    
    ======================================================================
    FAIL: test_configure_width (test.test_tkinter.test_widgets.RadiobuttonTest.test_configure_width)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 553, in test_configure_width
        self.checkIntegerParam(widget, 'width', 402, -402, 0)
        ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 81, in checkIntegerParam
        self.checkParams(widget, name, *values, **kwargs)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 78, in checkParams
        self.checkParam(widget, name, value, **kwargs)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -402
    
    ======================================================================
    FAIL: test_configure_values (test.test_tkinter.test_widgets.SpinboxTest.test_configure_values)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/test_widgets.py", line 554, in test_configure_values
        self.checkParam(widget, 'values', 'mon tue wed thur')
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: ('mon', 'tue', 'wed', 'thur') != 'mon tue wed thur'
    
    ======================================================================
    FAIL: test_configure_borderwidth (test.test_tkinter.test_widgets.TextTest.test_configure_borderwidth)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 250, in test_configure_borderwidth
        self.checkParam(widget, 'borderwidth', -2)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -2
    
    ======================================================================
    FAIL: test_configure_height (test.test_tkinter.test_widgets.TextTest.test_configure_height)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/test_widgets.py", line 652, in test_configure_height
        self.checkParam(widget, 'height', -100,
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
                            expected=1 if tk_version < (9, 0) else -100)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -100
    
    ======================================================================
    FAIL: test_configure_insertborderwidth (test.test_tkinter.test_widgets.TextTest.test_configure_insertborderwidth)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 265, in test_configure_insertborderwidth
        self.checkParam(widget, 'insertborderwidth', -2)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -2
    
    ======================================================================
    FAIL: test_configure_insertwidth (test.test_tkinter.test_widgets.TextTest.test_configure_insertwidth)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 269, in test_configure_insertwidth
        self.checkPixelsParam(widget, 'insertwidth', 1.3, 2.6, -2, '10p')
        ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 159, in checkPixelsParam
        self.checkParam(widget, name, value, expected=expected,
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                        conv=conv1, **kwargs)
                        ^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -2
    
    ======================================================================
    FAIL: test_configure_padx (test.test_tkinter.test_widgets.TextTest.test_configure_padx)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 274, in test_configure_padx
        self.checkParam(widget, 'padx', -2)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -2
    
    ======================================================================
    FAIL: test_configure_pady (test.test_tkinter.test_widgets.TextTest.test_configure_pady)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 279, in test_configure_pady
        self.checkParam(widget, 'pady', -2)
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -2
    
    ======================================================================
    FAIL: test_configure_selectborderwidth (test.test_tkinter.test_widgets.TextTest.test_configure_selectborderwidth)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/test_widgets.py", line 673, in test_configure_selectborderwidth
        self.checkPixelsParam(widget, 'selectborderwidth',
        ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              1.3, 2.6, -2, '10p', conv=False)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 159, in checkPixelsParam
        self.checkParam(widget, name, value, expected=expected,
        ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                        conv=conv1, **kwargs)
                        ^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 58, in checkParam
        self.assertEqual2(widget[name], expected, eq=eq)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/nad/Projects/PyDev/active/dev/3x/source/Lib/test/test_tkinter/widget_tests.py", line 39, in assertEqual2
        self.assertEqual(actual, expected, msg)
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: 0 != -2
    
    ----------------------------------------------------------------------
    Ran 86 tests in 0.558s
    
    FAILED (failures=25)
    test test_tkinter failed
    
  12. culler commented on Jul 22, 2025

    @culler
    ContributorAuthor

    Thank you, Ned!

    These are familiar-looking, easy-to-fix and not unexpected errors. They are not unexpected because there has been an effort
    to handle all options which represent screen distances in a consistent way, and to use the new "pixel" object type where appropriate. The Tk changes translate into tkinter test failures where

    • an expected negative integer value should changed to be 0; or
    • a an expected float value should be rounded to its nearest integer; or
    • an expected string representation of an integer should be replaced by the integer.

    In my pull request I fixed many failures of these types and tried to set things up so that fixing others would be easy. But Tk did not adjust all of these options in one big change; Instead it was done one widget at a time. A number of options have been modified since the time when my PR was accepted.

    Fixing one of these is a minor change - it involves a standard change or addition of one attribute of one of the test classes.

    As far as I know, this project to handle screnn distances consistently is now finished. So this won't need to be repeated for every release of Tk 9.0.X. (or Tk 9.1.X). Note that the 9.0 series is transitional and will end in 2026. But I don't think any changes will be needed to tkinter to migrate from 9.0 to 9.1. I am currently using the same tkinter code with both 9.0 and 9.1.

  13. added 2 commits that reference this issue on Aug 5, 2025
  14. hugovk commented on Aug 5, 2025

    @hugovk
    Member

    Please could you check PR #137424?

  15. added a commit that references this issue on Oct 7, 2025
  16. added 2 commits that reference this issue on Oct 7, 2025
  17. added a commit that references this issue on Oct 7, 2025
  18. added a commit that references this issue on Oct 7, 2025
  19. added a commit that references this issue on Oct 7, 2025
  20. added 5 commits that reference this issue on Oct 14, 2025
  21. aivarannamaa commented on Oct 27, 2025

    @aivarannamaa
    Contributor

    I see that macOS installer of 3.15 now uses Tcl/Tk 9.0.2. Thank you!

    What's the state with the Windows installer? Are there some blockers or it just needs to be updated? Any hope it will land in 3.15a2?

  22. terryjreedy commented on Oct 30, 2025

    @terryjreedy
    Member

    The current releases of 3.12 - 3.15 have 8.6.15 so that is no longer a blocker.

  23. culler commented on Oct 30, 2025

    @culler
    ContributorAuthor

    I don't think there is a blocker. Just inertia.

  24. added a commit that references this issue on Nov 12, 2025
  25. added 2 commits that reference this issue on Nov 12, 2025
  26. added 2 commits that reference this issue on Nov 12, 2025
  27. added a commit that references this issue on Dec 6, 2025
  28. added 2 commits that reference this issue on Feb 10, 2026
  29. added a commit that references this issue on Feb 15, 2026
  30. ThingamabobsCoding commented on Feb 23, 2026

    @ThingamabobsCoding

    I'm looking forward to use tkinter 8.7 since 2021 and today is the day I may ask if there is a release in sight?

  31. added a commit that references this issue on Apr 25, 2026
  32. maj113 commented on May 3, 2026

    @maj113

    Any news on this? Tkinter for Windows is still on 8.6.x

  33. picnixz commented on May 3, 2026

    @picnixz
    Member

    Any news on this? Tkinter for Windows is still on 8.6.x

    cc @zooba

  34. ajkessel commented on May 4, 2026

    @ajkessel

    Just to chime in: there is no easy way to build a Mac universal2 python app that relies on Tk and will be accepted by the App Store. The problem is that Tkinter 8.6 unnecessarily includes a symbol for a deprecated API, so the App Store will reject the submission. The problem is discussed here. The workaround takes some work -- I just recently published a script here as a temporary solution. Having Python universal2 with Tk 9 support would eliminate this problem and make it much easier to build Python apps for the App STore.

  35. maj113 commented on May 4, 2026

    @maj113

    Having Python universal2 with Tk 9 support would eliminate this problem and make it much easier to build Python apps

    I thought MacOS is already on Tk/tcl9.0.3

  36. ned-deily commented on May 4, 2026

    @ned-deily
    Member

    Having Python universal2 with Tk 9 support would eliminate this problem and make it much easier to build Python apps
    I thought MacOS is already on Tk/tcl9.0.3

    As of this moment, the current macOS python.org installers for Python 3.13.x and 3.14.x still use Tk 8.6.x out of concern for introducing incompatibilities in the middle of a release cycle. The installers for the 3.15 release cycle, now moving from alpha to beta phase, are currently using Tk 9.0.x. There are certainly advantages to using 9.0.x. The questions are: how much of a disruption would it be to current 3.14.x users to upgrade vs the benefits. And how to make that decision? To what extent are Tk 8.6.x vs 9.0 differences visible to tkinter users, both in code and in results? Not necessarily easy questions to answer. Opinions?

  37. maj113 commented on May 4, 2026

    @maj113

    Having Python universal2 with Tk 9 support would eliminate this problem and make it much easier to build Python apps
    I thought MacOS is already on Tk/tcl9.0.3

    As of this moment, the current macOS python.org installers for Python 3.13.x and 3.14.x still use Tk 8.6.x out of concern for introducing incompatibilities in the middle of a release cycle. The installers for the 3.15 release cycle, now moving from alpha to beta phase, are currently using Tk 9.0.x. There are certainly advantages to using 9.0.x. The questions are: how much of a disruption would it be to current 3.14.x users to upgrade vs the benefits. And how to make that decision? To what extent are Tk 8.6.x vs 9.0 differences visible to tkinter users, both in code and in results? Not necessarily easy questions to answer. Opinions?

    Well it's a bit hard to gauge this without a build to test for regressions/visual changes etc, if a build of py3.14/13 with tk/TCL 9.x was made it would be much easier for us to actually check what breaks, what needs to be changed etc, I am happy to test this on my own project I don't think nuitka work with 3.15 so I can't test that route yet

  38. ThingamabobsCoding commented on May 4, 2026

    @ThingamabobsCoding

    As of this moment, the current macOS python.org installers for Python 3.13.x and 3.14.x still use Tk 8.6.x out of concern for introducing incompatibilities in the middle of a release cycle. The installers for the 3.15 release cycle, now moving from alpha to beta phase, are currently using Tk 9.0.x. There are certainly advantages to using 9.0.x. The questions are: how much of a disruption would it be to current 3.14.x users to upgrade vs the benefits. And how to make that decision? To what extent are Tk 8.6.x vs 9.0 differences visible to tkinter users, both in code and in results? Not necessarily easy questions to answer. Opinions?

    While I'm confident I could make you a list with to what extent Tk 9.0 will be visible to tkinter users, since all we need to get started is the pre-built tcl interpreter. The most important reason to backport sooner is for mac, since applications already break (widgets aren't rendered, windows just don't show up etc.) and even worse they can't be distributed with tk 8.6. - So you can't break whats already be broken. In addition, since tkinter just is a thin wrapper around the tk package there is not much of a change, rather there are a lot of add-ons, new features and fixes. Just tcl-user-scripts would (IIRC) break, but that's something you can't prevent anyways as long as you don't plan to retire tkinter with 8.6

    For me personally I'll wait for a windows installer and would be more than happy if this year is the year, tkinter finally will makes it into the first stable release of 3.15. But the radio-silence on this issue made me wonder if nobody is actually working on it. Like I said I'm watching the progress since 2021 and even this issue is from 2024. Is there any light to this tunnel ?

  39. ajkessel commented on May 4, 2026

    @ajkessel

    Having Python universal2 with Tk 9 support would eliminate this problem and make it much easier to build Python apps
    I thought MacOS is already on Tk/tcl9.0.3

    As of this moment, the current macOS python.org installers for Python 3.13.x and 3.14.x still use Tk 8.6.x out of concern for introducing incompatibilities in the middle of a release cycle. The installers for the 3.15 release cycle, now moving from alpha to beta phase, are currently using Tk 9.0.x. There are certainly advantages to using 9.0.x. The questions are: how much of a disruption would it be to current 3.14.x users to upgrade vs the benefits. And how to make that decision? To what extent are Tk 8.6.x vs 9.0 differences visible to tkinter users, both in code and in results? Not necessarily easy questions to answer. Opinions?

    I would certainly appreciate a Tk 9 backport option if only to solve the issue of being able to submit apps built with pyinstaller to the App Store.

  40. aivarannamaa commented on May 5, 2026

    @aivarannamaa
    Contributor

    The installers for the 3.15 release cycle, now moving from alpha to beta phase, are currently using Tk 9.0.x.

    Is it also the case for Windows? The changelog mentions the update for macOS installer, but not for Windows.

  41. ned-deily commented on May 5, 2026

    @ned-deily
    Member

    The installers for the 3.15 release cycle, now moving from alpha to beta phase, are currently using Tk 9.0.x.
    Is it also the case for Windows? The changelog mentions the update for macOS installer, but not for Windows.

    In this context installers meant python.org installers for macOS.

    Perhaps @zooba, @zware, and/or @hugovk can say something about Tk with Python Windows builds.

  42. hugovk commented on May 5, 2026

    @hugovk
    Member

    Looks like it's still on 8.6.15:

    <TclVersion Condition="$(TclVersion) == ''">8.6.15.0</TclVersion>

    #124449

  43. maj113 commented on May 5, 2026

    @maj113

    Maybe we could get a CI with the latest non-prerelease Python builds with newer Tk/Tcl (than what is present in latest stable Py builds) so we can test stuff. Somewhat annoying to test with prerelease Python versions where other packages aren't ready yet/don't work with it etc

  44. hugovk commented on May 5, 2026

    @hugovk
    Member

    What do you mean by CI?

  45. maj113 commented on May 5, 2026

    @maj113

    What do you mean by CI?

    GitHub Actions or whatever other continuous integration is used to create a python build, kinda like how is done for JIT and tail call interpeter actions but instead it also publishes the built python release as an artiract

  46. zware commented on May 5, 2026

    @zware
    Member

    say something about Tk with Python Windows builds.

    Still on 8.6.15 for now. I have added 9.0.3 to cpython-source-deps, but ran into failures in the attempt to build the artifacts for cpython-bin-deps and haven't gotten back to it to diagnose and fix.

  47. ajkessel commented on May 5, 2026

    @ajkessel

    Note that NSWindowDidOrderOnScreenNotification, the App Store blocker, is still referenced in tk 9.0.3 source code, but it should not be included in the binary since it is disabled via #if 0 . There is a Tk ticket also discussing this issue.

  48. ned-deily commented on May 6, 2026

    @ned-deily
    Member

    With regard to Tk 9 and the Python 3.14 python.org installers for macOS, thanks for your comments.

    TL;DR Here's a chance to test the latest Python 3.14 on macOS with Tk 9.0.3 but act fast!

    From my own experience with running Python's test suite, I appreciate that the parts of Tk 9.0 that tkinter uses, and that we have tests for, seem to perform as well as or better, particularly on macOS 26 Tahoe, than Tk 8.6.17. That is thanks to the hard work of the Tk project and especially Marc Culler (@culler). As a result of the recent feedback here, I have now done some testing of the latest 3.14 with Tk 9.0.3 on macOS, running the portions of the Python test suite that exercise IDLE, tkinter, and, thus, Tk, testing that we have been doing with Python 3.15, the next feature release currently under development. I found no obvious problems using Tk 9 with 3.14, other than one test case which erroneously fails due to a typo in a backport of the test case (now fixed for the next 3.14 release). Be aware that there were a number of changes made over time in the tkinter module and the Python test suite to accomodate running with both Tk 8.6.x and 9.0.x; some of these differences might affect your tkinter code as well. A quick inspection of both branches suggests that all or nearly all of those changes in the current main (3.15) branch are also in the 3.14 branch. And, as mentioned earlier, we have been shipping Tk 9 with the macOS Python 3.15.0 alpha preview releases over the past months.

    But the proof is in the testing. As a result of your feedback and with the approval of the 3.14 release manager (@hugovk), we are making available for download a test version of the 3.14.5 release candidate 1 macOS installer that uses Tk 9.0.3 instead of 8.6.17. The contents of this test installer is built from the same Python source tag (v3.14.0rc1) as the official installer released yesterday (2025-05-04). As you may know, we usually do not publish Python release candidates anymore but an exception was recently made for 3.14.5 due to the scope of some fixes for a regression (unrelated to tkinter or Tk). As such, the accelerated current plan is to release 3.14.5 in a few days.

    That means that there is a small window of opportunity here: if there is sufficient positive feedback in the next few days prior to the release date, we might be able to convince the release manager to ship 3.14.5 final for macOS with Tk 9.0.3 despite the short exposure period. Otherwise, we can still work towards shipping Tk 9 with a future 3.14 release for macOS and, we hope, for Windows as well.

    The test installer for macOS is available to download from here:

    https://www.python.org/ftp/python/3.14.5/python-3.14.5rc1_tcltk_903-macos11.pkg

    The download file can be checked with the built-in openssl utility on macOS:

    openssl dgst -sha256 python-3.14.5rc1_tcltk_903-macos11.pkg
        SHA2256(python-3.14.5rc1_tcltk_903-macos11.pkg)= 
        c0bff72318e4ed66a60b21915178c47740a9245133ab8204d522c5352db2b640
    
    

    and the installer is signed with the usual Python Software Foundation Apple Developer certificates.

    Please leave any feedback here on this issue for now. Thanks and good luck!

  49. culler commented on May 6, 2026

    @culler
    ContributorAuthor

    Here is some information about the not-too-distant future of tkinter. The Tcl/Tk project has now (!) started maintaining an informational TIP (TIP 713) that contains the planned release schedule for Tcl and (usually) Tk. Some highlights are:

    • The final release of the 8.6 series will be 8.6.18, for which a release candidate is currently being tested.
    • The final release of the 9.0 series will be 9.0.6, with a target release date in December 2026. It was always planned that 9.0 would have a short life span. It was meant to ease the transition when 8.7 was dropped.
    • A beta release of 9.1 is planned for June.

    So, looking forward, the 9.1 series should probably be the choice for tkinter in Python 3.16. There won't be fundamental differences between 9.0 and 9.1 for macOS - just (hopefully) some added features for which Apple provides pretty good support (e.g. accessibilty and right-to-left languages).

  50. culler commented on May 6, 2026

    @culler
    ContributorAuthor

    While I am very appreciative of the shout-out from Ned, I would like to say that the key idea, as well as a near complete proof-of-concept implementation, for the change between Tk 8.6 and 9.0 on macOS was due to Christopher Chavez. That idea was to use the updateLayer method of the NSView class in place of its drawRect method. The former allows creating and drawing directly to a CGImage backing store for a window. This is a much better fit for the design of Tk and allowed many annoying and problematic race conditions to be eliminated.

  51. added a commit that references this issue on May 6, 2026
  52. ajkessel commented on May 6, 2026

    @ajkessel

    The test installer for macOS is available to download from here:

    Thanks for this! I did some quick testing with my app and everything works perfectly without any changes -- looks a little better on MacOS than with the old tcltk, performance is excellent.

  53. maj113 commented on May 6, 2026

    @maj113

    Great to see some progress on this, patiently waiting for a Windows test build 😅

  54. added a commit that references this issue on May 6, 2026
  55. zware commented on May 7, 2026

    @zware
    Member

    PR GH-149477 has some test failures on Windows with Tcl/Tk 9.0.3 that could use some investigation. They look to me like they're probably test issues that we just need to work around, but I'd like someone more knowledgeable (@serhiy-storchaka or maybe @culler?) to confirm that before I do any working around. I especially want to confirm that there's not some build option that I've missed that would affect encodings like this.

    The failures:

    ======================================================================
    FAIL: test_eval_surrogates_in_result (test.test_tcl.TclTest.test_eval_surrogates_in_result)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\a\cpython\cpython\Lib\test\test_tcl.py", line 57, in test_eval_surrogates_in_result
        self.assertEqual(tcl.eval(r'set a "<\ud83d\udcbb>"'), '<\U0001f4bb>')
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: '<\ud83d\udcbb>' != '<💻>'
    - <\ud83d\udcbb>
    + <💻>
    
    ======================================================================
    FAIL: test_evalfile_surrogates_in_result (test.test_tcl.TclTest.test_evalfile_surrogates_in_result)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\a\cpython\cpython\Lib\test\test_tcl.py", line 292, in test_evalfile_surrogates_in_result
        self.assertEqual(tcl.eval('set b'), '<\U0001f4bb>')
        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError: '<\ud83d\udcbb>' != '<💻>'
    - <\ud83d\udcbb>
    + <💻>
    
    ----------------------------------------------------------------------
  56. culler commented on May 7, 2026

    @culler
    ContributorAuthor

    My initial guess is that those tests are verifying that Tcl is handling unicode in the specific quirky way that was used in 8.6. Since Tcl 9 handles unicode correctly those tests probably need to be updated. I would not be surprised if the old unicode interface was different for Windows and macOS. The appearance of the word "surrogate" is a big clue in support of this theory.

  57. culler commented on May 7, 2026

    @culler
    ContributorAuthor

    Here is what happens in python:

    >>> print("\ud83d\udcbb")
    Traceback (most recent call last):
      File "<python-input-0>", line 1, in <module>
        print("\ud83d\udcbb")
        ~~~~~^^^^^^^^^^^^^^^^
    UnicodeEncodeError: 'utf-8' codec can't encode characters in position 0-1: surrogates not allowed

    Tcl 8.6 used a variant of the utf-8 encoding, called CESU-8, which encodes UTF-16 surrogates. I think this test is trying to make sure that Tcl 9 is doing that, which it isn't. An analogous error to the one above should be raised in Tcl 9.

  58. oehhar commented on May 8, 2026

    @oehhar

    Dear @zware: @culler called out to Tcl Unicode experts to confirm. @jan.nijtmans would be the right person and may second.

    Here is my comment:
    Tcl/Tk 9 switched from 16 to 32 bit Unicode internal representation.
    In consequence, surrogate pairs are now illegal.
    On the UTF-8 level, CESU-8 is now illegal.
    Internally, UTF-8 is used with the exception, that the NULL Unicode value is represented by \uC080.

    There is a whole new set of access functions which check, that no illegal codes are entering the internals. Those access functions also do the \u0000->\uC080 transformation.

    Practically, this means that surrogate pairs should be replaced by their 32 bit counterpart.

    In addition to that, the ICU library is now used to find glyphes from Unicode Codepoints. Rendering of Upper Plane and Left to Right font handling is highly improved.

    I am sorry to underline, that competent answers are better found when asking on Tk fossil: https://core.tcl-lang.org/tk

    Please come back in case of any questions. Take care,
    Harald

  59. added 2 commits that reference this issue on May 9, 2026
  60. added a commit that references this issue on May 10, 2026
  61. hugovk commented on May 10, 2026

    @hugovk
    Member

    The macOS installer now uses Tcl/Tk 9.0.3 in the newly release Python 3.14.5:

    https://blog.python.org/2026/05/python-3145-is-out/

    Thanks @ned-deily, and everyone for testing!

  62. added 7 commits that reference this issue on May 12, 2026
  63. added 2 commits that reference this issue on May 19, 2026
  64. aivarannamaa commented on May 21, 2026

    @aivarannamaa
    Contributor

    I see that Tk 9.0.3 came to the Windows build of Python 3.15, thank you!

    Can we get it in the next Windows builds of Python 3.14 as well?

  65. zware commented on May 21, 2026

    @zware
    Member

    We do expect to backport the Windows update 3.14 for parity with macOS, but we would like to have some more testing on the 3.15 pre-releases first. I've gone ahead and opened the backport PR as a draft to make it easier for interested parties to build their own, but it's not going to be merged quite yet.

  66. added a commit that references this issue on Jun 9, 2026
  67. ajkessel commented on Jun 16, 2026

    @ajkessel

    The one obstacle I'm hitting with Tk 9.x is transparency support on MacOS. Tk has changed how it interacts with the MacOS window manager such that it may be impossible to have widgets with rounded edges without ugly borders outside the rounded edges.

    For example, here is a screenshot of a tooltip demo from Custom2kinter (a recent fork of customtkinter) on Tk 8.6:

    Image

    The same demo on Tk 9.0:

    Image

    I've been banging my head against the wall trying to an elegant solution but it seems there may be none on the Python side. Wondering if anyone else on this issue looking to move to Tk 9.x has discovered this and, if so, if there are any workarounds/fixes.

  68. culler commented on Jun 16, 2026

    @culler
    ContributorAuthor

    The place to start is by running the widget demo called "Window styles for macOS.

    There are several layers here. Tk 8.6 used Carbon features to control window styles. The commands to do that were in the ::tk::unsupported:: namespace. Tk 9.0 preserved the Carbon based command ::tk::unsupported::MacWindowStyle but also added a supported command wm attriributes -stylemask command which provides access to all of the [NSWindow styleMask] bits. It is possible that tkinter is still using the unsupported commands (which will disappear in 9.1) but tkinter provides access to the stylemask through the wm_attributes method. This is not perfect, but as a start you could try something like:

    >>> from tkinter import *
    >>> root = Tk()
    >>> tt = Toplevel(bg="#a0a0a0")
    >>> l = Label(tt, bg="#a0a0a0", text="Move the mouse")
    >>> l.pack(padx=50, pady=5)
    >>> tt.wm_attributes(stylemask='docmodal')
    

    That produces:

    Image

    I am not sure that docmodal is what you want, however. It has other features, which you may or may not want, such as being an NSPanel rather than an NSWindow and always being topmost.

    If you provide a stylemask which does not include 'titled' you will get square corners, which is what I would use for a tooltip, but apparentlly not what you want. Another option is

    >>> from tkinter import *
    >>> root = Tk()
    >>> tt = Toplevel(bg="#a0a0a0")
    >>> l = Label(tt, bg="#a0a0a0", text="Move the mouse")
    >>> l.pack(padx=50, pady=5)
    >>> tt.title('')
    ''
    >>> tt.wm_attributes(stylemask=('fullsizecontent','titled'))
    

    For me this gives:

    Image

    The fullsizecontent bit is heavily used by Apple these days -- it gives a window whose titlebar is part of the background of the window, rather than having a separator line. (Safari is an example.) A window with fullsizecontent set can be dragged with the mouse by its title bar, even though the title bar blends into the background.

    You can read the Apple documentation for [NSWindow styleMask] for more information.

  69. culler commented on Jun 16, 2026

    @culler
    ContributorAuthor

    Just to make sure that the white background in your image does not appear when the fullsizecontent window is on top of another Tk window, I put it on top of a flamingo-colored root window:

    Image
  70. ajkessel commented on Jun 16, 2026

    @ajkessel

    Thanks @culler ! I'm trying to follow your example, but adding a wm_attributes stylemask does not have any visible effect for me in the customtkinter.run_showroom() demo. Here's the patch I applied. Am I approaching this the wrong way to apply a stylemask?

  71. culler commented on Jun 16, 2026

    @culler
    ContributorAuthor

    What happens if you run my code in the terminal? Does it work?

    It is possible that you need to wait for the window to be displayed or call update_idletasks, or both, before you can apply the stylemask.

    This works for me if I run it as a python script, but it needs the update_idletasks:

    from tkinter import *
    root = Tk()
    root.configure(bg='#ffa0a0')
    tt = Toplevel(bg="#a0a0a0")
    l = Label(tt, bg="#a0a0a0", text="Move the mouse")
    l.pack(padx=50, pady=5)
    tt.title('')
    tt.update_idletasks()
    tt.wm_attributes(stylemask=('fullsizecontent','titled'))
    root.mainloop()
  72. ajkessel commented on Jun 16, 2026

    @ajkessel

    Figured it out--the problem was toplevel.overrideredirect(True).

    This patch gives exactly the intended result in my testing on MacOS+Tk 9.0.

    It is possible that tkinter is still using the unsupported commands (which will disappear in 9.1)

    Just to clarify this comment--the fix we've found here will not disappear in 9.1, right? The fix should be durable?

  73. culler commented on Jun 16, 2026

    @culler
    ContributorAuthor

    Yes. It will work in 9.1 too. It does not involve any ::tk::unsupported commands. The wm attributes -stylemask command is supported by both 9.0 and 9.1. Also I just checked the _tkinter.c file in the Python 3.14.5 source code, and it does not use any unsupported commands.

  74. culler commented on Jun 16, 2026

    @culler
    ContributorAuthor

    One comment about your patch. I thought you would need to include the "titled" bit as well as the "fullsizecontent" bit. Are you saying that is not needed?

  75. ajkessel commented on Jun 16, 2026

    @ajkessel

    One comment about your patch. I thought you would need to include the "titled" bit as well as the "fullsizecontent" bit. Are you saying that is not needed?

    Oh, good catch. I was inconsistent: I had in one call but not the other. If I remove it from both, the tooltips are no longer rounded. If I include it in both, I get the desired effect. So titled does seem to be necessary for this widget to behave in 9.0 the way it worked in 8.6.

  76. added a commit that references this issue on Jul 11, 2026
  77. added 3 commits that reference this issue on Jul 17, 2026
  78. added a commit that references this issue on Jul 18, 2026
  79. added 3 commits that reference this issue on Jul 18, 2026
  80. added a commit that references this issue on Aug 3, 2026
  81. zware commented on Aug 3, 2026

    @zware
    Member

    With 3.14+ updated to 9.0.4 on macOS and Windows, this is now complete. Thanks to everyone who contributed!

  82. TheDemonGuard commented on Aug 5, 2026

    @TheDemonGuard

    With 3.14+ updated to 9.0.4 on macOS and Windows, this is now complete. Thanks to everyone who contributed!

    I installed 3.14.6 on Windows. However I am still getting TK version 8.6.
    The command I used to confirm this is as follows

    python -c "import tkinter; print(tkinter.TkVersion);print('-----');import sys; print(sys.version); print(sys.executable)"
    8.6
    -----
    3.14.6 (tags/v3.14.6:c63aec6, Jun 10 2026, 10:26:10) [MSC v.1944 64 bit (AMD64)]
    
  83. maj113 commented on Aug 5, 2026

    @maj113

    With 3.14+ updated to 9.0.4 on macOS and Windows, this is now complete. Thanks to everyone who contributed!

    I installed 3.14.6 on Windows. However I am still getting TK version 8.6. The command I used to confirm this is as follows

    python -c "import tkinter; print(tkinter.TkVersion);print('-----');import sys; print(sys.version); print(sys.executable)"
    8.6
    -----
    3.14.6 (tags/v3.14.6:c63aec6, Jun 10 2026, 10:26:10) [MSC v.1944 64 bit (AMD64)]
    

    Most likely not yet published on the python website, the .6 was published on June 10th also looking at the tags .7 does not exist yet, might take a while

  84. hugovk commented on Aug 5, 2026

    @hugovk
    Member

    Python 3.14.7 will hopefully be released later today (5th August), after #153711 is fixed.

  85. TheDemonGuard commented on Aug 7, 2026

    @TheDemonGuard

    Python 3.14.7 will hopefully be released later today (5th August), after #153711 is fixed.

    Thank you. I can confirm that Python 3.14.7 includes Tk 9.0.4 on Windows.
    On MacOS, I confirmed that Python 3.14.6 includes Tk 9.0.4.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions