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 <noreply@anthropic.com>
This commit is contained in:
Serhiy Storchaka 2026-06-22 20:43:43 +03:00 committed by GitHub
parent 6cbb225c9e
commit 27148d0857
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 53 additions and 2 deletions

View file

@ -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

View file

@ -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
---

View file

@ -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()

View file

@ -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

View file

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