diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 90bb5db7eb38d8..f72912632deb92 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -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 diff --git a/Doc/whatsnew/3.16.rst b/Doc/whatsnew/3.16.rst index 3ee8de18cb5cd3..af4e7f6fda59fc 100644 --- a/Doc/whatsnew/3.16.rst +++ b/Doc/whatsnew/3.16.rst @@ -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). diff --git a/Lib/test/test_tkinter/test_misc.py b/Lib/test/test_tkinter/test_misc.py index e764ce91b1161c..1bf50ffb2f3911 100644 --- a/Lib/test/test_tkinter/test_misc.py +++ b/Lib/test/test_tkinter/test_misc.py @@ -650,6 +650,15 @@ def test_tk_inactive(self): # 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) diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index d8172ff5c4087a..afd92096e86b10 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -3131,6 +3131,12 @@ def __init__(self, master=None, cnf={}, **kw): 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) @@ -4072,6 +4078,12 @@ def __init__(self, master=None, cnf={}, **kw): """ 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 index 00000000000000..db61bdb7f7b97d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-07-06-14-18-33.gh-issue-153256.tkPrnt.rst @@ -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.