]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-153256: Add tk_print() methods to tkinter Canvas and Text (GH-153257)
authorSerhiy Storchaka <storchaka@gmail.com>
Sat, 11 Jul 2026 05:12:52 +0000 (08:12 +0300)
committerGitHub <noreply@github.com>
Sat, 11 Jul 2026 05:12:52 +0000 (05:12 +0000)
The native print dialog (the "tk print" command, Tk 8.7/9.0+) only
supports canvas and text widgets, so expose it as a method of Canvas
and Text rather than of Misc.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Doc/library/tkinter.rst
Doc/whatsnew/3.16.rst
Lib/test/test_tkinter/test_misc.py
Lib/tkinter/__init__.py
Misc/NEWS.d/next/Library/2026-07-06-14-18-33.gh-issue-153256.tkPrnt.rst [new file with mode: 0644]

index 90bb5db7eb38d8330576aff014c2d7ea78344c34..f72912632deb92413ec4b3a0cf58737a7ee5e576 100644 (file)
@@ -3555,6 +3555,13 @@ Widget classes
    A newly created item is placed at the top of the list; the order can be
    changed with :meth:`tag_raise` and :meth:`tag_lower`.
 
+   .. method:: tk_print()
+
+      Print the contents of the canvas using the native print dialog.
+      Requires Tk 8.7/9.0 or newer.
+
+      .. versionadded:: next
+
    .. method:: create_arc(*args, **kw)
                create_bitmap(*args, **kw)
                create_image(*args, **kw)
@@ -5366,6 +5373,13 @@ Widget classes
    to its base; several modifiers may be combined and are applied from left to
    right, for example ``'insert wordstart - 1 c'``.
 
+   .. method:: tk_print()
+
+      Print the contents of the text widget using the native print dialog.
+      Requires Tk 8.7/9.0 or newer.
+
+      .. versionadded:: next
+
    .. method:: insert(index, chars, *args)
 
       Insert the string *chars* just before the character at *index* (if
index 3ee8de18cb5cd38e1738a4d316f9962306876d5c..af4e7f6fda59fcaa0f965f875d1f9a76d62a0c06 100644 (file)
@@ -406,6 +406,11 @@ tkinter
   report the user idle time.
   (Contributed by Serhiy Storchaka in :gh:`151881`.)
 
+* Added the :meth:`!tk_print` method to :class:`tkinter.Canvas` and
+  :class:`tkinter.Text` which prints the contents of the widget using the
+  native print dialog.  It requires Tk 8.7/9.0 or newer.
+  (Contributed by Serhiy Storchaka in :gh:`153256`.)
+
 * Added new window-management methods :meth:`~tkinter.Misc.winfo_isdark`
   (dark mode detection), :meth:`~tkinter.Wm.wm_iconbadge` (application icon
   badge) and :meth:`~tkinter.Wm.wm_stackorder` (toplevel stacking order).
index d315a23ef794deabf3b02fa527a4c91d3d6ab29d..a225079dd99091bbe1c0f3980aad1ba6656ff616 100644 (file)
@@ -651,6 +651,15 @@ class MiscTest(AbstractTkTest, unittest.TestCase):
         # Resetting the timer returns None and does not raise.
         self.assertIsNone(self.root.tk_inactive(reset=True))
 
+    def test_tk_print(self):
+        # tk print supports only canvas and text widgets, so tk_print is a
+        # method of Canvas and Text only.  Calling it opens the print
+        # dialog, so the behavior itself cannot be tested here.
+        self.assertHasAttr(tkinter.Canvas, 'tk_print')
+        self.assertHasAttr(tkinter.Text, 'tk_print')
+        self.assertNotHasAttr(tkinter.Frame, 'tk_print')
+        self.assertNotHasAttr(tkinter.Misc, 'tk_print')
+
     def test_wait_variable(self):
         var = tkinter.StringVar(self.root)
         self.assertEqual(self.root.waitvar, self.root.wait_variable)
index 0616dadcbbf210c5a1bb69b5f503d35c31e02084..6c8eef02478c774f776e66d950e69f51a5cd53c0 100644 (file)
@@ -3133,6 +3133,12 @@ class Canvas(Widget, XView, YView):
         yscrollcommand, yscrollincrement."""
         Widget.__init__(self, master, 'canvas', cnf, kw)
 
+    def tk_print(self):
+        """Print the contents of the canvas using the native print dialog.
+
+        Requires Tk 8.7/9.0 or newer."""
+        self.tk.call('tk', 'print', self._w)
+
     def addtag(self, *args):
         """Internal function."""
         self.tk.call((self._w, 'addtag') + args)
@@ -4074,6 +4080,12 @@ class Text(Widget, XView, YView):
         """
         Widget.__init__(self, master, 'text', cnf, kw)
 
+    def tk_print(self):
+        """Print the contents of the text widget using the native print dialog.
+
+        Requires Tk 8.7/9.0 or newer."""
+        self.tk.call('tk', 'print', self._w)
+
     def bbox(self, index):  # overrides Misc.bbox
         """Return a tuple of (x,y,width,height) which gives the bounding
         box of the visible part of the character at the given index."""
diff --git a/Misc/NEWS.d/next/Library/2026-07-06-14-18-33.gh-issue-153256.tkPrnt.rst b/Misc/NEWS.d/next/Library/2026-07-06-14-18-33.gh-issue-153256.tkPrnt.rst
new file mode 100644 (file)
index 0000000..db61bdb
--- /dev/null
@@ -0,0 +1,3 @@
+Added the :meth:`!tk_print` method to :class:`tkinter.Canvas` and
+:class:`tkinter.Text` which prints the contents of the widget using the
+native print dialog.  It requires Tk 8.7/9.0 or newer.