Author: Francois Vogel <[email protected]>
State: Final
Type: Project
Vote: Done
Vote-Summary: Accepted 6/0/0
Votes-For: MC, JD, DKF, FV, KW
Votes-Against: none
Votes-Present: none
Created: 24-Aug-2020
Post-History:
Keywords: Tk ttk introspection
Tcl-Version: 8.7
Tk-Branch: ttk_introspect
Tk-Branch: tip-584
Abstract
This TIP proposes to improve introspection capabilities of ttk.
Rationale
People regularly request (for instance in TkDocs, in TIP #555, or recently again in comp.lang.tcl) that ttk introspection capabilities be improved.
As it seems, the really missing bit is the ability to retrieve styles.
Specification
1. Obtaining all styles from a theme
A new subcommand
ttk::style theme styles ?themeName?
is created. It returns a list of all styles from themeName. If themeName is omitted, the current theme is used.
With this new command, the user can request all styles available in a given theme (or in the current theme). For example on Windows one can get:
% ttk::style theme names
winnative clam alt default classic vista xpnative
% set curtheme [ttk::style theme use]
vista
% # leverage the new command ttk::style theme styles
% ttk::style theme styles $curtheme
Label TScale Horizontal.TScale TMenubutton TLabelframe.Label Vertical.TProgressbar TEntry TRadiobutton TButton Heading Toolbutton TNotebook.Tab ComboboxPopdownFrame Treeview Vertical.TScale TCombobox TNotebook TProgressbar Horizontal.TProgressbar . TCheckbutton Item TSpinbox Tab
% ttk::style theme styles clam
TMenubutton TEntry TLabelframe Vertical.Sash TRadiobutton Heading TButton TNotebook.Tab Toolbutton Treeview ComboboxPopdownFrame TCombobox TProgressbar . TCheckbutton Tab TSpinbox Horizontal.Sash Sash
Then it becomes straightforward to get all layouts, as originally requested in TIP #555:
# get layout for each style
foreach st [ttk::style theme styles] {
if {[catch {ttk::style layout $st}]} {
puts "$st: has no layout"
} else {
puts "$st:\n[ttk::style layout $st]"
}
}
This spits:
Label:
Label.fill -sticky nswe -children {Label.text -sticky nswe}
TScale: has no layout
Horizontal.TScale:
Scale.focus -sticky nswe -children {Horizontal.Scale.trough -sticky nswe -children {Horizontal.Scale.track -sticky we Horizontal.Scale.slider -side left -sticky {}}}
<...and so on...>
2. Obtaining the style used by a given ttk widget
A new subcommand
.pathname style
is created. It returns the style actually used by any ttk widget .pathname. This new command is added as a standard widget command (documented in ttk_widget(n)).
Examples of use:
% ttk::scrollbar .sv ; # default orient is vertical
.sv
% .sv style
Vertical.TScrollbar
%
% ttk::scrollbar .sh -orient horizontal
.sh
% .sh style
Horizontal.TScrollbar
%
% ttk::style configure style1.TButton -background yellow
% ttk::button .b -style style1.TButton
.b
% .b style
style1.TButton
Note that this new style command is different from getting the -style option of the widget since [.pathname cget -style] returns the empty string if .pathname uses the default style of the widget.
Also, this is not the same as the widget class that one can get through [winfo class .pathname].
Implementation
See the ttk_introspect branch, aka tip-584.
This branch targets 8.7.
Copyright
This document has been placed in the public domain.
