https://github.com/python/cpython/commit/27148d0857efb28bcbbf7ff393050c1256aae239
commit: 27148d0857efb28bcbbf7ff393050c1256aae239
branch: main
author: Serhiy Storchaka <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2026-06-22T20:43:43+03:00
summary:

gh-151920: Add the ttk.Style.theme_styles() method (GH-151921)

Wrap the Tk 9.0 ``ttk::style theme styles ?themeName?`` subcommand as
ttk.Style.theme_styles(themename=None), returning the list of styles
defined in a theme (the current theme if themename is omitted).

Co-authored-by: Claude Opus 4.8 <[email protected]>

files:
A Misc/NEWS.d/next/Library/2026-06-22-14-30-00.gh-issue-151920.Th3mSt.rst
M Doc/library/tkinter.ttk.rst
M Doc/whatsnew/3.16.rst
M Lib/test/test_ttk/test_style.py
M Lib/tkinter/ttk.py

diff --git a/Doc/library/tkinter.ttk.rst b/Doc/library/tkinter.ttk.rst
index fc79c7fa1845d5..b375b6908679de 100644
--- a/Doc/library/tkinter.ttk.rst
+++ b/Doc/library/tkinter.ttk.rst
@@ -2016,6 +2016,16 @@ If you don't know the class name of a widget, use the 
method
       Returns a tuple of all known themes.
 
 
+   .. method:: theme_styles(themename=None)
+
+      Returns a tuple of all styles in *themename*.
+      If *themename* is not given, the current theme is used.
+
+      .. versionadded:: next
+
+      Availability: Tk 9.0.
+
+
    .. method:: theme_use(themename=None)
 
       If *themename* is not given, returns the theme in use.  Otherwise, sets
diff --git a/Doc/whatsnew/3.16.rst b/Doc/whatsnew/3.16.rst
index c5d73ede9224ff..f394298da96a7c 100644
--- a/Doc/whatsnew/3.16.rst
+++ b/Doc/whatsnew/3.16.rst
@@ -173,6 +173,11 @@ tkinter
   synchronization of the displayed view with the underlying text.
   (Contributed by Serhiy Storchaka in :gh:`151675`.)
 
+* Added the :meth:`ttk.Style.theme_styles
+  <tkinter.ttk.Style.theme_styles>` method which returns the list of styles
+  defined in a theme.
+  (Contributed by Serhiy Storchaka in :gh:`151920`.)
+
 * Added new :class:`!tkinter.Canvas` methods :meth:`~tkinter.Canvas.rchars`
   which replaces the text or coordinates of canvas items, and
   :meth:`~tkinter.Canvas.rotate` which rotates the coordinates of canvas items.
@@ -211,7 +216,6 @@ tkinter
   dithered image when its data was supplied in pieces.
   (Contributed by Serhiy Storchaka in :gh:`151888`.)
 
-
 xml
 ---
 
diff --git a/Lib/test/test_ttk/test_style.py b/Lib/test/test_ttk/test_style.py
index f85f76eb499278..6fbcfbdc9b9e4f 100644
--- a/Lib/test/test_ttk/test_style.py
+++ b/Lib/test/test_ttk/test_style.py
@@ -6,7 +6,8 @@
 from test import support
 from test.support import requires
 from test.test_tkinter.support import setUpModule  # noqa: F401
-from test.test_tkinter.support import AbstractTkTest, get_tk_patchlevel
+from test.test_tkinter.support import (AbstractTkTest, get_tk_patchlevel,
+                                       requires_tk)
 
 requires('gui')
 
@@ -124,6 +125,25 @@ def test_theme_use(self):
 
         self.style.theme_use(curr_theme)
 
+    @requires_tk(9, 0)
+    def test_theme_styles(self):
+        # The 'default' theme is always available and defines the base styles.
+        default_styles = self.style.theme_styles('default')
+        self.assertIsInstance(default_styles, tuple)
+        self.assertIn('.', default_styles)
+        self.assertIn('TButton', default_styles)
+
+        # Without an argument the current theme is used.
+        styles = self.style.theme_styles()
+        self.assertIsInstance(styles, tuple)
+        self.assertIn('.', styles)
+
+        for theme in self.style.theme_names():
+            self.assertIsInstance(self.style.theme_styles(theme), tuple)
+
+        self.assertRaises(tkinter.TclError,
+                          self.style.theme_styles, 'nonexistingname')
+
     def test_theme_settings(self):
         style = self.style
         theme = style.theme_use()
diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py
index c3a5ac160573a6..0cabc5c3140fd6 100644
--- a/Lib/tkinter/ttk.py
+++ b/Lib/tkinter/ttk.py
@@ -492,6 +492,20 @@ def theme_names(self):
         return self.tk.splitlist(self.tk.call(self._name, "theme", "names"))
 
 
+    def theme_styles(self, themename=None):
+        """Returns a list of all styles in themename.
+
+        If themename is omitted, the current theme is used.
+
+        Availability: Tk 9.0.
+        """
+        if themename is None:
+            return self.tk.splitlist(
+                self.tk.call(self._name, "theme", "styles"))
+        return self.tk.splitlist(
+            self.tk.call(self._name, "theme", "styles", themename))
+
+
     def theme_use(self, themename=None):
         """If themename is None, returns the theme in use, otherwise, set
         the current theme to themename, refreshes all widgets and emits
diff --git 
a/Misc/NEWS.d/next/Library/2026-06-22-14-30-00.gh-issue-151920.Th3mSt.rst 
b/Misc/NEWS.d/next/Library/2026-06-22-14-30-00.gh-issue-151920.Th3mSt.rst
new file mode 100644
index 00000000000000..2c4a069a794b10
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-06-22-14-30-00.gh-issue-151920.Th3mSt.rst
@@ -0,0 +1,3 @@
+Add the :meth:`ttk.Style.theme_styles <tkinter.ttk.Style.theme_styles>`
+method, wrapping the Tk ``ttk::style theme styles`` subcommand, which
+returns the list of styles defined in a theme.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to