Edit on GitHub

azure.example

Example script for testing the Azure ttk theme.

  1# SPDX-FileCopyrightText: © 2021 rdbende <rdbende@proton.me>
  2# SPDX-License-Identifier: MIT
  3
  4"""
  5Example script for testing the Azure ttk theme.
  6"""
  7
  8from __future__ import annotations
  9
 10import tkinter as tk
 11from tkinter import ttk
 12
 13# These lint errors don't make sense for GUI widgets, so are disabled here.
 14# pragma pylint: disable=too-many-instance-attributes, too-many-ancestors
 15
 16
 17class App(ttk.Frame):
 18    """
 19    The example application window.
 20    """
 21
 22    def __init__(self, parent: tk.Misc | None) -> None:
 23        ttk.Frame.__init__(self, parent)
 24
 25        # Make the app responsive
 26        for index in [0, 1, 2]:
 27            self.columnconfigure(index=index, weight=1)
 28            self.rowconfigure(index=index, weight=1)
 29
 30        # Create value lists
 31        self.option_menu_list = ["", "OptionMenu", "Option 1", "Option 2"]
 32        self.combo_list = ["Combobox", "Editable item 1", "Editable item 2"]
 33        self.readonly_combo_list = ["Readonly combobox", "Item 1", "Item 2"]
 34
 35        # Create control variables
 36        self.var_0 = tk.BooleanVar()
 37        self.var_1 = tk.BooleanVar(value=True)
 38        self.var_2 = tk.BooleanVar()
 39        self.var_3 = tk.IntVar(value=2)
 40        self.var_4 = tk.StringVar(value=self.option_menu_list[1])
 41        self.var_5 = tk.DoubleVar(value=75.0)
 42
 43        # Create widgets :)
 44        self.setup_widgets()
 45
 46    def setup_widgets(self) -> None:  # noqa: PLR0915 # pylint: disable=R0915
 47        """
 48        Set up the widgets.
 49        """
 50        # Create a Frame for the Checkbuttons
 51        self.check_frame = ttk.LabelFrame(self, text="Checkbuttons", padding=(20, 10))
 52        self.check_frame.grid(
 53            row=0, column=0, padx=(20, 10), pady=(20, 10), sticky="nsew"
 54        )
 55
 56        # Checkbuttons
 57        self.check_1 = ttk.Checkbutton(
 58            self.check_frame, text="Unchecked", variable=self.var_0
 59        )
 60        self.check_1.grid(row=0, column=0, padx=5, pady=10, sticky="nsew")
 61
 62        self.check_2 = ttk.Checkbutton(
 63            self.check_frame, text="Checked", variable=self.var_1
 64        )
 65        self.check_2.grid(row=1, column=0, padx=5, pady=10, sticky="nsew")
 66
 67        self.check_3 = ttk.Checkbutton(
 68            self.check_frame, text="Third state", variable=self.var_2
 69        )
 70        self.check_3.state(["alternate"])
 71        self.check_3.grid(row=2, column=0, padx=5, pady=10, sticky="nsew")
 72
 73        self.check_4 = ttk.Checkbutton(
 74            self.check_frame, text="Disabled", state="disabled"
 75        )
 76        self.check_4.state(["disabled !alternate"])
 77        self.check_4.grid(row=3, column=0, padx=5, pady=10, sticky="nsew")
 78
 79        # Separator
 80        self.separator = ttk.Separator(self)
 81        self.separator.grid(row=1, column=0, padx=(20, 10), pady=10, sticky="ew")
 82
 83        # Create a Frame for the Radiobuttons
 84        self.radio_frame = ttk.LabelFrame(self, text="Radiobuttons", padding=(20, 10))
 85        self.radio_frame.grid(row=2, column=0, padx=(20, 10), pady=10, sticky="nsew")
 86
 87        # Radiobuttons
 88        self.radio_1 = ttk.Radiobutton(
 89            self.radio_frame, text="Unselected", variable=self.var_3, value=1
 90        )
 91        self.radio_1.grid(row=0, column=0, padx=5, pady=10, sticky="nsew")
 92        self.radio_2 = ttk.Radiobutton(
 93            self.radio_frame, text="Selected", variable=self.var_3, value=2
 94        )
 95        self.radio_2.grid(row=1, column=0, padx=5, pady=10, sticky="nsew")
 96        self.radio_4 = ttk.Radiobutton(
 97            self.radio_frame, text="Disabled", state="disabled"
 98        )
 99        self.radio_4.grid(row=3, column=0, padx=5, pady=10, sticky="nsew")
100
101        # Create a Frame for input widgets
102        self.widgets_frame = ttk.Frame(self, padding=(0, 0, 0, 10))
103        self.widgets_frame.grid(
104            row=0, column=1, padx=10, pady=(30, 10), sticky="nsew", rowspan=3
105        )
106        self.widgets_frame.columnconfigure(index=0, weight=1)
107
108        # Entry
109        self.entry = ttk.Entry(self.widgets_frame)
110        self.entry.insert(0, "Entry")
111        self.entry.grid(row=0, column=0, padx=5, pady=(0, 10), sticky="ew")
112
113        # Spinbox
114        self.spinbox = ttk.Spinbox(self.widgets_frame, from_=0, to=100, increment=0.1)
115        self.spinbox.insert(0, "Spinbox")
116        self.spinbox.grid(row=1, column=0, padx=5, pady=10, sticky="ew")
117
118        # Combobox
119        self.combobox = ttk.Combobox(self.widgets_frame, values=self.combo_list)
120        self.combobox.current(0)
121        self.combobox.grid(row=2, column=0, padx=5, pady=10, sticky="ew")
122
123        # Read-only combobox
124        self.readonly_combo = ttk.Combobox(
125            self.widgets_frame, state="readonly", values=self.readonly_combo_list
126        )
127        self.readonly_combo.current(0)
128        self.readonly_combo.grid(row=3, column=0, padx=5, pady=10, sticky="ew")
129
130        # Menu for the Menubutton
131        self.menu = tk.Menu(self)
132        self.menu.add_command(label="Menu item 1")
133        self.menu.add_command(label="Menu item 2")
134        self.menu.add_separator()
135        self.menu.add_command(label="Menu item 3")
136        self.menu.add_command(label="Menu item 4")
137
138        # Menubutton
139        self.menubutton = ttk.Menubutton(
140            self.widgets_frame, text="Menubutton", menu=self.menu, direction="below"
141        )
142        self.menubutton.grid(row=4, column=0, padx=5, pady=10, sticky="nsew")
143
144        # OptionMenu
145        self.optionmenu = ttk.OptionMenu(
146            self.widgets_frame, self.var_4, *self.option_menu_list
147        )
148        self.optionmenu.grid(row=5, column=0, padx=5, pady=10, sticky="nsew")
149
150        # Button
151        self.button = ttk.Button(self.widgets_frame, text="Button")
152        self.button.grid(row=6, column=0, padx=5, pady=10, sticky="nsew")
153
154        # Accentbutton
155        self.accentbutton = ttk.Button(
156            self.widgets_frame, text="Accent button", style="Accent.TButton"
157        )
158        self.accentbutton.grid(row=7, column=0, padx=5, pady=10, sticky="nsew")
159
160        # Togglebutton
161        self.togglebutton = ttk.Checkbutton(
162            self.widgets_frame, text="Toggle button", style="Toggle.TButton"
163        )
164        self.togglebutton.grid(row=8, column=0, padx=5, pady=10, sticky="nsew")
165
166        # Switch
167        self.switch = ttk.Checkbutton(
168            self.widgets_frame, text="Switch", style="Switch.TCheckbutton"
169        )
170        self.switch.grid(row=9, column=0, padx=5, pady=10, sticky="nsew")
171
172        # Panedwindow
173        self.paned = ttk.PanedWindow(self)
174        self.paned.grid(row=0, column=2, pady=(25, 5), sticky="nsew", rowspan=3)
175
176        # Pane #1
177        self.pane_1 = ttk.Frame(self.paned, padding=5)
178        self.paned.add(self.pane_1, weight=1)
179
180        # Scrollbar
181        self.scrollbar = ttk.Scrollbar(self.pane_1)
182        self.scrollbar.pack(side="right", fill="y")
183
184        # Treeview
185        self.treeview = ttk.Treeview(
186            self.pane_1,
187            selectmode="browse",
188            yscrollcommand=self.scrollbar.set,
189            columns=(1, 2),
190            height=10,
191        )
192        self.treeview.pack(expand=True, fill="both")
193        self.scrollbar.config(command=self.treeview.yview)
194
195        # Treeview columns
196        self.treeview.column("#0", anchor="w", width=120)
197        self.treeview.column(1, anchor="w", width=120)
198        self.treeview.column(2, anchor="w", width=120)
199
200        # Treeview headings
201        self.treeview.heading("#0", text="Column 1", anchor="center")
202        self.treeview.heading(1, text="Column 2", anchor="center")
203        self.treeview.heading(2, text="Column 3", anchor="center")
204
205        # Define treeview data
206        treeview_data = [
207            ("", 1, "Parent", ("Item 1", "Value 1")),
208            (1, 2, "Child", ("Subitem 1.1", "Value 1.1")),
209            (1, 3, "Child", ("Subitem 1.2", "Value 1.2")),
210            (1, 4, "Child", ("Subitem 1.3", "Value 1.3")),
211            (1, 5, "Child", ("Subitem 1.4", "Value 1.4")),
212            ("", 6, "Parent", ("Item 2", "Value 2")),
213            (6, 7, "Child", ("Subitem 2.1", "Value 2.1")),
214            (6, 8, "Sub-parent", ("Subitem 2.2", "Value 2.2")),
215            (8, 9, "Child", ("Subitem 2.2.1", "Value 2.2.1")),
216            (8, 10, "Child", ("Subitem 2.2.2", "Value 2.2.2")),
217            (8, 11, "Child", ("Subitem 2.2.3", "Value 2.2.3")),
218            (6, 12, "Child", ("Subitem 2.3", "Value 2.3")),
219            (6, 13, "Child", ("Subitem 2.4", "Value 2.4")),
220            ("", 14, "Parent", ("Item 3", "Value 3")),
221            (14, 15, "Child", ("Subitem 3.1", "Value 3.1")),
222            (14, 16, "Child", ("Subitem 3.2", "Value 3.2")),
223            (14, 17, "Child", ("Subitem 3.3", "Value 3.3")),
224            (14, 18, "Child", ("Subitem 3.4", "Value 3.4")),
225            ("", 19, "Parent", ("Item 4", "Value 4")),
226            (19, 20, "Child", ("Subitem 4.1", "Value 4.1")),
227            (19, 21, "Sub-parent", ("Subitem 4.2", "Value 4.2")),
228            (21, 22, "Child", ("Subitem 4.2.1", "Value 4.2.1")),
229            (21, 23, "Child", ("Subitem 4.2.2", "Value 4.2.2")),
230            (21, 24, "Child", ("Subitem 4.2.3", "Value 4.2.3")),
231            (19, 25, "Child", ("Subitem 4.3", "Value 4.3")),
232        ]
233
234        # Insert treeview data
235        for item in treeview_data:
236            self.treeview.insert(
237                parent=str(item[0]), index="end", iid=item[1], text=item[2], values=item[3]
238            )
239            if item[0] == "" or item[1] in {8, 21}:
240                self.treeview.item(item[1], open=True)  # Open parents
241
242        # Select and scroll
243        self.treeview.selection_set(10)
244        self.treeview.see(7)
245
246        # Notebook, pane #2
247        self.pane_2 = ttk.Frame(self.paned, padding=5)
248        self.paned.add(self.pane_2, weight=3)
249
250        # Notebook, pane #2
251        self.notebook = ttk.Notebook(self.pane_2)
252        self.notebook.pack(fill="both", expand=True)
253
254        # Tab #1
255        self.tab_1 = ttk.Frame(self.notebook)
256        for index in [0, 1]:
257            self.tab_1.columnconfigure(index=index, weight=1)
258            self.tab_1.rowconfigure(index=index, weight=1)
259        self.notebook.add(self.tab_1, text="Tab 1")
260
261        # Scale
262        self.scale = ttk.Scale(
263            self.tab_1,
264            from_=100,
265            to=0,
266            variable=self.var_5,
267            command=lambda _event: self.var_5.set(self.scale.get()),
268        )
269        self.scale.grid(row=0, column=0, padx=(20, 10), pady=(20, 0), sticky="ew")
270
271        # Progressbar
272        self.progress = ttk.Progressbar(
273            self.tab_1, value=0, variable=self.var_5, mode="determinate"
274        )
275        self.progress.grid(row=0, column=1, padx=(10, 20), pady=(20, 0), sticky="ew")
276
277        # Label
278        self.label = ttk.Label(
279            self.tab_1,
280            text="Azure theme for ttk",
281            justify="center",
282            font=["-size", 15, "-weight", "bold"],
283        )
284        self.label.grid(row=1, column=0, pady=10, columnspan=2)
285
286        # Tab #2
287        self.tab_2 = ttk.Frame(self.notebook)
288        self.notebook.add(self.tab_2, text="Tab 2")
289
290        # Tab #3
291        self.tab_3 = ttk.Frame(self.notebook)
292        self.notebook.add(self.tab_3, text="Tab 3")
293
294        # Sizegrip
295        self.sizegrip = ttk.Sizegrip(self)
296        self.sizegrip.grid(row=100, column=100, padx=(0, 5), pady=(0, 5))
297
298
299if __name__ == "__main__":
300    root = tk.Tk()
301    root.title("")
302
303    # Simply set the theme
304    root.tk.call("source", "azure.tcl")
305    root.tk.call("set_theme", "dark")
306
307    app = App(root)
308    app.pack(fill="both", expand=True)
309
310    # Set a minsize for the window, and place it in the middle
311    root.update()
312    root.minsize(root.winfo_width(), root.winfo_height())
313    x_cordinate = int((root.winfo_screenwidth() / 2) - (root.winfo_width() / 2))
314    y_cordinate = int((root.winfo_screenheight() / 2) - (root.winfo_height() / 2))
315    root.geometry(f"+{x_cordinate}+{y_cordinate-20}")
316
317    root.mainloop()
class App(tkinter.ttk.Frame):
 18class App(ttk.Frame):
 19    """
 20    The example application window.
 21    """
 22
 23    def __init__(self, parent: tk.Misc | None) -> None:
 24        ttk.Frame.__init__(self, parent)
 25
 26        # Make the app responsive
 27        for index in [0, 1, 2]:
 28            self.columnconfigure(index=index, weight=1)
 29            self.rowconfigure(index=index, weight=1)
 30
 31        # Create value lists
 32        self.option_menu_list = ["", "OptionMenu", "Option 1", "Option 2"]
 33        self.combo_list = ["Combobox", "Editable item 1", "Editable item 2"]
 34        self.readonly_combo_list = ["Readonly combobox", "Item 1", "Item 2"]
 35
 36        # Create control variables
 37        self.var_0 = tk.BooleanVar()
 38        self.var_1 = tk.BooleanVar(value=True)
 39        self.var_2 = tk.BooleanVar()
 40        self.var_3 = tk.IntVar(value=2)
 41        self.var_4 = tk.StringVar(value=self.option_menu_list[1])
 42        self.var_5 = tk.DoubleVar(value=75.0)
 43
 44        # Create widgets :)
 45        self.setup_widgets()
 46
 47    def setup_widgets(self) -> None:  # noqa: PLR0915 # pylint: disable=R0915
 48        """
 49        Set up the widgets.
 50        """
 51        # Create a Frame for the Checkbuttons
 52        self.check_frame = ttk.LabelFrame(self, text="Checkbuttons", padding=(20, 10))
 53        self.check_frame.grid(
 54            row=0, column=0, padx=(20, 10), pady=(20, 10), sticky="nsew"
 55        )
 56
 57        # Checkbuttons
 58        self.check_1 = ttk.Checkbutton(
 59            self.check_frame, text="Unchecked", variable=self.var_0
 60        )
 61        self.check_1.grid(row=0, column=0, padx=5, pady=10, sticky="nsew")
 62
 63        self.check_2 = ttk.Checkbutton(
 64            self.check_frame, text="Checked", variable=self.var_1
 65        )
 66        self.check_2.grid(row=1, column=0, padx=5, pady=10, sticky="nsew")
 67
 68        self.check_3 = ttk.Checkbutton(
 69            self.check_frame, text="Third state", variable=self.var_2
 70        )
 71        self.check_3.state(["alternate"])
 72        self.check_3.grid(row=2, column=0, padx=5, pady=10, sticky="nsew")
 73
 74        self.check_4 = ttk.Checkbutton(
 75            self.check_frame, text="Disabled", state="disabled"
 76        )
 77        self.check_4.state(["disabled !alternate"])
 78        self.check_4.grid(row=3, column=0, padx=5, pady=10, sticky="nsew")
 79
 80        # Separator
 81        self.separator = ttk.Separator(self)
 82        self.separator.grid(row=1, column=0, padx=(20, 10), pady=10, sticky="ew")
 83
 84        # Create a Frame for the Radiobuttons
 85        self.radio_frame = ttk.LabelFrame(self, text="Radiobuttons", padding=(20, 10))
 86        self.radio_frame.grid(row=2, column=0, padx=(20, 10), pady=10, sticky="nsew")
 87
 88        # Radiobuttons
 89        self.radio_1 = ttk.Radiobutton(
 90            self.radio_frame, text="Unselected", variable=self.var_3, value=1
 91        )
 92        self.radio_1.grid(row=0, column=0, padx=5, pady=10, sticky="nsew")
 93        self.radio_2 = ttk.Radiobutton(
 94            self.radio_frame, text="Selected", variable=self.var_3, value=2
 95        )
 96        self.radio_2.grid(row=1, column=0, padx=5, pady=10, sticky="nsew")
 97        self.radio_4 = ttk.Radiobutton(
 98            self.radio_frame, text="Disabled", state="disabled"
 99        )
100        self.radio_4.grid(row=3, column=0, padx=5, pady=10, sticky="nsew")
101
102        # Create a Frame for input widgets
103        self.widgets_frame = ttk.Frame(self, padding=(0, 0, 0, 10))
104        self.widgets_frame.grid(
105            row=0, column=1, padx=10, pady=(30, 10), sticky="nsew", rowspan=3
106        )
107        self.widgets_frame.columnconfigure(index=0, weight=1)
108
109        # Entry
110        self.entry = ttk.Entry(self.widgets_frame)
111        self.entry.insert(0, "Entry")
112        self.entry.grid(row=0, column=0, padx=5, pady=(0, 10), sticky="ew")
113
114        # Spinbox
115        self.spinbox = ttk.Spinbox(self.widgets_frame, from_=0, to=100, increment=0.1)
116        self.spinbox.insert(0, "Spinbox")
117        self.spinbox.grid(row=1, column=0, padx=5, pady=10, sticky="ew")
118
119        # Combobox
120        self.combobox = ttk.Combobox(self.widgets_frame, values=self.combo_list)
121        self.combobox.current(0)
122        self.combobox.grid(row=2, column=0, padx=5, pady=10, sticky="ew")
123
124        # Read-only combobox
125        self.readonly_combo = ttk.Combobox(
126            self.widgets_frame, state="readonly", values=self.readonly_combo_list
127        )
128        self.readonly_combo.current(0)
129        self.readonly_combo.grid(row=3, column=0, padx=5, pady=10, sticky="ew")
130
131        # Menu for the Menubutton
132        self.menu = tk.Menu(self)
133        self.menu.add_command(label="Menu item 1")
134        self.menu.add_command(label="Menu item 2")
135        self.menu.add_separator()
136        self.menu.add_command(label="Menu item 3")
137        self.menu.add_command(label="Menu item 4")
138
139        # Menubutton
140        self.menubutton = ttk.Menubutton(
141            self.widgets_frame, text="Menubutton", menu=self.menu, direction="below"
142        )
143        self.menubutton.grid(row=4, column=0, padx=5, pady=10, sticky="nsew")
144
145        # OptionMenu
146        self.optionmenu = ttk.OptionMenu(
147            self.widgets_frame, self.var_4, *self.option_menu_list
148        )
149        self.optionmenu.grid(row=5, column=0, padx=5, pady=10, sticky="nsew")
150
151        # Button
152        self.button = ttk.Button(self.widgets_frame, text="Button")
153        self.button.grid(row=6, column=0, padx=5, pady=10, sticky="nsew")
154
155        # Accentbutton
156        self.accentbutton = ttk.Button(
157            self.widgets_frame, text="Accent button", style="Accent.TButton"
158        )
159        self.accentbutton.grid(row=7, column=0, padx=5, pady=10, sticky="nsew")
160
161        # Togglebutton
162        self.togglebutton = ttk.Checkbutton(
163            self.widgets_frame, text="Toggle button", style="Toggle.TButton"
164        )
165        self.togglebutton.grid(row=8, column=0, padx=5, pady=10, sticky="nsew")
166
167        # Switch
168        self.switch = ttk.Checkbutton(
169            self.widgets_frame, text="Switch", style="Switch.TCheckbutton"
170        )
171        self.switch.grid(row=9, column=0, padx=5, pady=10, sticky="nsew")
172
173        # Panedwindow
174        self.paned = ttk.PanedWindow(self)
175        self.paned.grid(row=0, column=2, pady=(25, 5), sticky="nsew", rowspan=3)
176
177        # Pane #1
178        self.pane_1 = ttk.Frame(self.paned, padding=5)
179        self.paned.add(self.pane_1, weight=1)
180
181        # Scrollbar
182        self.scrollbar = ttk.Scrollbar(self.pane_1)
183        self.scrollbar.pack(side="right", fill="y")
184
185        # Treeview
186        self.treeview = ttk.Treeview(
187            self.pane_1,
188            selectmode="browse",
189            yscrollcommand=self.scrollbar.set,
190            columns=(1, 2),
191            height=10,
192        )
193        self.treeview.pack(expand=True, fill="both")
194        self.scrollbar.config(command=self.treeview.yview)
195
196        # Treeview columns
197        self.treeview.column("#0", anchor="w", width=120)
198        self.treeview.column(1, anchor="w", width=120)
199        self.treeview.column(2, anchor="w", width=120)
200
201        # Treeview headings
202        self.treeview.heading("#0", text="Column 1", anchor="center")
203        self.treeview.heading(1, text="Column 2", anchor="center")
204        self.treeview.heading(2, text="Column 3", anchor="center")
205
206        # Define treeview data
207        treeview_data = [
208            ("", 1, "Parent", ("Item 1", "Value 1")),
209            (1, 2, "Child", ("Subitem 1.1", "Value 1.1")),
210            (1, 3, "Child", ("Subitem 1.2", "Value 1.2")),
211            (1, 4, "Child", ("Subitem 1.3", "Value 1.3")),
212            (1, 5, "Child", ("Subitem 1.4", "Value 1.4")),
213            ("", 6, "Parent", ("Item 2", "Value 2")),
214            (6, 7, "Child", ("Subitem 2.1", "Value 2.1")),
215            (6, 8, "Sub-parent", ("Subitem 2.2", "Value 2.2")),
216            (8, 9, "Child", ("Subitem 2.2.1", "Value 2.2.1")),
217            (8, 10, "Child", ("Subitem 2.2.2", "Value 2.2.2")),
218            (8, 11, "Child", ("Subitem 2.2.3", "Value 2.2.3")),
219            (6, 12, "Child", ("Subitem 2.3", "Value 2.3")),
220            (6, 13, "Child", ("Subitem 2.4", "Value 2.4")),
221            ("", 14, "Parent", ("Item 3", "Value 3")),
222            (14, 15, "Child", ("Subitem 3.1", "Value 3.1")),
223            (14, 16, "Child", ("Subitem 3.2", "Value 3.2")),
224            (14, 17, "Child", ("Subitem 3.3", "Value 3.3")),
225            (14, 18, "Child", ("Subitem 3.4", "Value 3.4")),
226            ("", 19, "Parent", ("Item 4", "Value 4")),
227            (19, 20, "Child", ("Subitem 4.1", "Value 4.1")),
228            (19, 21, "Sub-parent", ("Subitem 4.2", "Value 4.2")),
229            (21, 22, "Child", ("Subitem 4.2.1", "Value 4.2.1")),
230            (21, 23, "Child", ("Subitem 4.2.2", "Value 4.2.2")),
231            (21, 24, "Child", ("Subitem 4.2.3", "Value 4.2.3")),
232            (19, 25, "Child", ("Subitem 4.3", "Value 4.3")),
233        ]
234
235        # Insert treeview data
236        for item in treeview_data:
237            self.treeview.insert(
238                parent=str(item[0]), index="end", iid=item[1], text=item[2], values=item[3]
239            )
240            if item[0] == "" or item[1] in {8, 21}:
241                self.treeview.item(item[1], open=True)  # Open parents
242
243        # Select and scroll
244        self.treeview.selection_set(10)
245        self.treeview.see(7)
246
247        # Notebook, pane #2
248        self.pane_2 = ttk.Frame(self.paned, padding=5)
249        self.paned.add(self.pane_2, weight=3)
250
251        # Notebook, pane #2
252        self.notebook = ttk.Notebook(self.pane_2)
253        self.notebook.pack(fill="both", expand=True)
254
255        # Tab #1
256        self.tab_1 = ttk.Frame(self.notebook)
257        for index in [0, 1]:
258            self.tab_1.columnconfigure(index=index, weight=1)
259            self.tab_1.rowconfigure(index=index, weight=1)
260        self.notebook.add(self.tab_1, text="Tab 1")
261
262        # Scale
263        self.scale = ttk.Scale(
264            self.tab_1,
265            from_=100,
266            to=0,
267            variable=self.var_5,
268            command=lambda _event: self.var_5.set(self.scale.get()),
269        )
270        self.scale.grid(row=0, column=0, padx=(20, 10), pady=(20, 0), sticky="ew")
271
272        # Progressbar
273        self.progress = ttk.Progressbar(
274            self.tab_1, value=0, variable=self.var_5, mode="determinate"
275        )
276        self.progress.grid(row=0, column=1, padx=(10, 20), pady=(20, 0), sticky="ew")
277
278        # Label
279        self.label = ttk.Label(
280            self.tab_1,
281            text="Azure theme for ttk",
282            justify="center",
283            font=["-size", 15, "-weight", "bold"],
284        )
285        self.label.grid(row=1, column=0, pady=10, columnspan=2)
286
287        # Tab #2
288        self.tab_2 = ttk.Frame(self.notebook)
289        self.notebook.add(self.tab_2, text="Tab 2")
290
291        # Tab #3
292        self.tab_3 = ttk.Frame(self.notebook)
293        self.notebook.add(self.tab_3, text="Tab 3")
294
295        # Sizegrip
296        self.sizegrip = ttk.Sizegrip(self)
297        self.sizegrip.grid(row=100, column=100, padx=(0, 5), pady=(0, 5))

The example application window.

App(parent: tkinter.Misc | None)
23    def __init__(self, parent: tk.Misc | None) -> None:
24        ttk.Frame.__init__(self, parent)
25
26        # Make the app responsive
27        for index in [0, 1, 2]:
28            self.columnconfigure(index=index, weight=1)
29            self.rowconfigure(index=index, weight=1)
30
31        # Create value lists
32        self.option_menu_list = ["", "OptionMenu", "Option 1", "Option 2"]
33        self.combo_list = ["Combobox", "Editable item 1", "Editable item 2"]
34        self.readonly_combo_list = ["Readonly combobox", "Item 1", "Item 2"]
35
36        # Create control variables
37        self.var_0 = tk.BooleanVar()
38        self.var_1 = tk.BooleanVar(value=True)
39        self.var_2 = tk.BooleanVar()
40        self.var_3 = tk.IntVar(value=2)
41        self.var_4 = tk.StringVar(value=self.option_menu_list[1])
42        self.var_5 = tk.DoubleVar(value=75.0)
43
44        # Create widgets :)
45        self.setup_widgets()

Construct a Ttk Frame with parent master.

STANDARD OPTIONS

class, cursor, style, takefocus

WIDGET-SPECIFIC OPTIONS

borderwidth, relief, padding, width, height
def setup_widgets(self) -> None:
 47    def setup_widgets(self) -> None:  # noqa: PLR0915 # pylint: disable=R0915
 48        """
 49        Set up the widgets.
 50        """
 51        # Create a Frame for the Checkbuttons
 52        self.check_frame = ttk.LabelFrame(self, text="Checkbuttons", padding=(20, 10))
 53        self.check_frame.grid(
 54            row=0, column=0, padx=(20, 10), pady=(20, 10), sticky="nsew"
 55        )
 56
 57        # Checkbuttons
 58        self.check_1 = ttk.Checkbutton(
 59            self.check_frame, text="Unchecked", variable=self.var_0
 60        )
 61        self.check_1.grid(row=0, column=0, padx=5, pady=10, sticky="nsew")
 62
 63        self.check_2 = ttk.Checkbutton(
 64            self.check_frame, text="Checked", variable=self.var_1
 65        )
 66        self.check_2.grid(row=1, column=0, padx=5, pady=10, sticky="nsew")
 67
 68        self.check_3 = ttk.Checkbutton(
 69            self.check_frame, text="Third state", variable=self.var_2
 70        )
 71        self.check_3.state(["alternate"])
 72        self.check_3.grid(row=2, column=0, padx=5, pady=10, sticky="nsew")
 73
 74        self.check_4 = ttk.Checkbutton(
 75            self.check_frame, text="Disabled", state="disabled"
 76        )
 77        self.check_4.state(["disabled !alternate"])
 78        self.check_4.grid(row=3, column=0, padx=5, pady=10, sticky="nsew")
 79
 80        # Separator
 81        self.separator = ttk.Separator(self)
 82        self.separator.grid(row=1, column=0, padx=(20, 10), pady=10, sticky="ew")
 83
 84        # Create a Frame for the Radiobuttons
 85        self.radio_frame = ttk.LabelFrame(self, text="Radiobuttons", padding=(20, 10))
 86        self.radio_frame.grid(row=2, column=0, padx=(20, 10), pady=10, sticky="nsew")
 87
 88        # Radiobuttons
 89        self.radio_1 = ttk.Radiobutton(
 90            self.radio_frame, text="Unselected", variable=self.var_3, value=1
 91        )
 92        self.radio_1.grid(row=0, column=0, padx=5, pady=10, sticky="nsew")
 93        self.radio_2 = ttk.Radiobutton(
 94            self.radio_frame, text="Selected", variable=self.var_3, value=2
 95        )
 96        self.radio_2.grid(row=1, column=0, padx=5, pady=10, sticky="nsew")
 97        self.radio_4 = ttk.Radiobutton(
 98            self.radio_frame, text="Disabled", state="disabled"
 99        )
100        self.radio_4.grid(row=3, column=0, padx=5, pady=10, sticky="nsew")
101
102        # Create a Frame for input widgets
103        self.widgets_frame = ttk.Frame(self, padding=(0, 0, 0, 10))
104        self.widgets_frame.grid(
105            row=0, column=1, padx=10, pady=(30, 10), sticky="nsew", rowspan=3
106        )
107        self.widgets_frame.columnconfigure(index=0, weight=1)
108
109        # Entry
110        self.entry = ttk.Entry(self.widgets_frame)
111        self.entry.insert(0, "Entry")
112        self.entry.grid(row=0, column=0, padx=5, pady=(0, 10), sticky="ew")
113
114        # Spinbox
115        self.spinbox = ttk.Spinbox(self.widgets_frame, from_=0, to=100, increment=0.1)
116        self.spinbox.insert(0, "Spinbox")
117        self.spinbox.grid(row=1, column=0, padx=5, pady=10, sticky="ew")
118
119        # Combobox
120        self.combobox = ttk.Combobox(self.widgets_frame, values=self.combo_list)
121        self.combobox.current(0)
122        self.combobox.grid(row=2, column=0, padx=5, pady=10, sticky="ew")
123
124        # Read-only combobox
125        self.readonly_combo = ttk.Combobox(
126            self.widgets_frame, state="readonly", values=self.readonly_combo_list
127        )
128        self.readonly_combo.current(0)
129        self.readonly_combo.grid(row=3, column=0, padx=5, pady=10, sticky="ew")
130
131        # Menu for the Menubutton
132        self.menu = tk.Menu(self)
133        self.menu.add_command(label="Menu item 1")
134        self.menu.add_command(label="Menu item 2")
135        self.menu.add_separator()
136        self.menu.add_command(label="Menu item 3")
137        self.menu.add_command(label="Menu item 4")
138
139        # Menubutton
140        self.menubutton = ttk.Menubutton(
141            self.widgets_frame, text="Menubutton", menu=self.menu, direction="below"
142        )
143        self.menubutton.grid(row=4, column=0, padx=5, pady=10, sticky="nsew")
144
145        # OptionMenu
146        self.optionmenu = ttk.OptionMenu(
147            self.widgets_frame, self.var_4, *self.option_menu_list
148        )
149        self.optionmenu.grid(row=5, column=0, padx=5, pady=10, sticky="nsew")
150
151        # Button
152        self.button = ttk.Button(self.widgets_frame, text="Button")
153        self.button.grid(row=6, column=0, padx=5, pady=10, sticky="nsew")
154
155        # Accentbutton
156        self.accentbutton = ttk.Button(
157            self.widgets_frame, text="Accent button", style="Accent.TButton"
158        )
159        self.accentbutton.grid(row=7, column=0, padx=5, pady=10, sticky="nsew")
160
161        # Togglebutton
162        self.togglebutton = ttk.Checkbutton(
163            self.widgets_frame, text="Toggle button", style="Toggle.TButton"
164        )
165        self.togglebutton.grid(row=8, column=0, padx=5, pady=10, sticky="nsew")
166
167        # Switch
168        self.switch = ttk.Checkbutton(
169            self.widgets_frame, text="Switch", style="Switch.TCheckbutton"
170        )
171        self.switch.grid(row=9, column=0, padx=5, pady=10, sticky="nsew")
172
173        # Panedwindow
174        self.paned = ttk.PanedWindow(self)
175        self.paned.grid(row=0, column=2, pady=(25, 5), sticky="nsew", rowspan=3)
176
177        # Pane #1
178        self.pane_1 = ttk.Frame(self.paned, padding=5)
179        self.paned.add(self.pane_1, weight=1)
180
181        # Scrollbar
182        self.scrollbar = ttk.Scrollbar(self.pane_1)
183        self.scrollbar.pack(side="right", fill="y")
184
185        # Treeview
186        self.treeview = ttk.Treeview(
187            self.pane_1,
188            selectmode="browse",
189            yscrollcommand=self.scrollbar.set,
190            columns=(1, 2),
191            height=10,
192        )
193        self.treeview.pack(expand=True, fill="both")
194        self.scrollbar.config(command=self.treeview.yview)
195
196        # Treeview columns
197        self.treeview.column("#0", anchor="w", width=120)
198        self.treeview.column(1, anchor="w", width=120)
199        self.treeview.column(2, anchor="w", width=120)
200
201        # Treeview headings
202        self.treeview.heading("#0", text="Column 1", anchor="center")
203        self.treeview.heading(1, text="Column 2", anchor="center")
204        self.treeview.heading(2, text="Column 3", anchor="center")
205
206        # Define treeview data
207        treeview_data = [
208            ("", 1, "Parent", ("Item 1", "Value 1")),
209            (1, 2, "Child", ("Subitem 1.1", "Value 1.1")),
210            (1, 3, "Child", ("Subitem 1.2", "Value 1.2")),
211            (1, 4, "Child", ("Subitem 1.3", "Value 1.3")),
212            (1, 5, "Child", ("Subitem 1.4", "Value 1.4")),
213            ("", 6, "Parent", ("Item 2", "Value 2")),
214            (6, 7, "Child", ("Subitem 2.1", "Value 2.1")),
215            (6, 8, "Sub-parent", ("Subitem 2.2", "Value 2.2")),
216            (8, 9, "Child", ("Subitem 2.2.1", "Value 2.2.1")),
217            (8, 10, "Child", ("Subitem 2.2.2", "Value 2.2.2")),
218            (8, 11, "Child", ("Subitem 2.2.3", "Value 2.2.3")),
219            (6, 12, "Child", ("Subitem 2.3", "Value 2.3")),
220            (6, 13, "Child", ("Subitem 2.4", "Value 2.4")),
221            ("", 14, "Parent", ("Item 3", "Value 3")),
222            (14, 15, "Child", ("Subitem 3.1", "Value 3.1")),
223            (14, 16, "Child", ("Subitem 3.2", "Value 3.2")),
224            (14, 17, "Child", ("Subitem 3.3", "Value 3.3")),
225            (14, 18, "Child", ("Subitem 3.4", "Value 3.4")),
226            ("", 19, "Parent", ("Item 4", "Value 4")),
227            (19, 20, "Child", ("Subitem 4.1", "Value 4.1")),
228            (19, 21, "Sub-parent", ("Subitem 4.2", "Value 4.2")),
229            (21, 22, "Child", ("Subitem 4.2.1", "Value 4.2.1")),
230            (21, 23, "Child", ("Subitem 4.2.2", "Value 4.2.2")),
231            (21, 24, "Child", ("Subitem 4.2.3", "Value 4.2.3")),
232            (19, 25, "Child", ("Subitem 4.3", "Value 4.3")),
233        ]
234
235        # Insert treeview data
236        for item in treeview_data:
237            self.treeview.insert(
238                parent=str(item[0]), index="end", iid=item[1], text=item[2], values=item[3]
239            )
240            if item[0] == "" or item[1] in {8, 21}:
241                self.treeview.item(item[1], open=True)  # Open parents
242
243        # Select and scroll
244        self.treeview.selection_set(10)
245        self.treeview.see(7)
246
247        # Notebook, pane #2
248        self.pane_2 = ttk.Frame(self.paned, padding=5)
249        self.paned.add(self.pane_2, weight=3)
250
251        # Notebook, pane #2
252        self.notebook = ttk.Notebook(self.pane_2)
253        self.notebook.pack(fill="both", expand=True)
254
255        # Tab #1
256        self.tab_1 = ttk.Frame(self.notebook)
257        for index in [0, 1]:
258            self.tab_1.columnconfigure(index=index, weight=1)
259            self.tab_1.rowconfigure(index=index, weight=1)
260        self.notebook.add(self.tab_1, text="Tab 1")
261
262        # Scale
263        self.scale = ttk.Scale(
264            self.tab_1,
265            from_=100,
266            to=0,
267            variable=self.var_5,
268            command=lambda _event: self.var_5.set(self.scale.get()),
269        )
270        self.scale.grid(row=0, column=0, padx=(20, 10), pady=(20, 0), sticky="ew")
271
272        # Progressbar
273        self.progress = ttk.Progressbar(
274            self.tab_1, value=0, variable=self.var_5, mode="determinate"
275        )
276        self.progress.grid(row=0, column=1, padx=(10, 20), pady=(20, 0), sticky="ew")
277
278        # Label
279        self.label = ttk.Label(
280            self.tab_1,
281            text="Azure theme for ttk",
282            justify="center",
283            font=["-size", 15, "-weight", "bold"],
284        )
285        self.label.grid(row=1, column=0, pady=10, columnspan=2)
286
287        # Tab #2
288        self.tab_2 = ttk.Frame(self.notebook)
289        self.notebook.add(self.tab_2, text="Tab 2")
290
291        # Tab #3
292        self.tab_3 = ttk.Frame(self.notebook)
293        self.notebook.add(self.tab_3, text="Tab 3")
294
295        # Sizegrip
296        self.sizegrip = ttk.Sizegrip(self)
297        self.sizegrip.grid(row=100, column=100, padx=(0, 5), pady=(0, 5))

Set up the widgets.

Inherited Members
tkinter.ttk.Widget
identify
instate
state
tkinter.BaseWidget
destroy
tkinter.Misc
deletecommand
tk_strictMotif
tk_bisque
tk_setPalette
wait_variable
waitvar
wait_window
wait_visibility
setvar
getvar
getboolean
focus_set
focus
focus_force
focus_get
focus_displayof
focus_lastfor
tk_focusFollowsMouse
tk_focusNext
tk_focusPrev
after
after_idle
after_cancel
bell
clipboard_get
clipboard_clear
clipboard_append
grab_current
grab_release
grab_set
grab_set_global
grab_status
option_add
option_clear
option_get
option_readfile
selection_clear
selection_get
selection_handle
selection_own
selection_own_get
send
lower
tkraise
lift
winfo_atom
winfo_atomname
winfo_cells
winfo_children
winfo_class
winfo_colormapfull
winfo_containing
winfo_depth
winfo_exists
winfo_fpixels
winfo_geometry
winfo_height
winfo_id
winfo_interps
winfo_ismapped
winfo_manager
winfo_name
winfo_parent
winfo_pathname
winfo_pixels
winfo_pointerx
winfo_pointerxy
winfo_pointery
winfo_reqheight
winfo_reqwidth
winfo_rgb
winfo_rootx
winfo_rooty
winfo_screen
winfo_screencells
winfo_screendepth
winfo_screenheight
winfo_screenmmheight
winfo_screenmmwidth
winfo_screenvisual
winfo_screenwidth
winfo_server
winfo_toplevel
winfo_viewable
winfo_visual
winfo_visualid
winfo_visualsavailable
winfo_vrootheight
winfo_vrootwidth
winfo_vrootx
winfo_vrooty
winfo_width
winfo_x
winfo_y
update
update_idletasks
bindtags
bind
unbind
bind_all
unbind_all
bind_class
unbind_class
mainloop
quit
nametowidget
register
configure
config
cget
keys
pack_propagate
propagate
pack_slaves
slaves
place_slaves
grid_anchor
anchor
grid_bbox
bbox
grid_columnconfigure
columnconfigure
grid_location
grid_propagate
grid_rowconfigure
rowconfigure
grid_size
size
grid_slaves
event_add
event_delete
event_generate
event_info
image_names
image_types
tkinter.Pack
pack_configure
pack_forget
forget
pack_info
info
pack
tkinter.Place
place_configure
place_forget
place_info
place
tkinter.Grid
grid_configure
grid_forget
grid_remove
grid_info
grid
location