Of course! Let's dive deep into tkinter.ttk.Labelframe. It's a fundamental and highly useful widget in Python's Tkinter library.

What is a ttk.Labelframe?
A Labelframe is a container widget, much like a Frame, but with a built-in title (or label) that describes the purpose of the widgets inside it. Think of it as a way to group related controls together, making your user interface more organized and intuitive for the user.
It combines the functionality of:
- A Label: To display a title.
- A Frame: To act as a container for other widgets.
It's part of the ttk (themed Tkinter) library, which provides widgets with a more modern, native look and feel compared to the classic tkinter widgets.
Key Characteristics
- Container: It holds other widgets (buttons, entries, checkboxes, etc.).
- Title: It has a prominent title, which is its main differentiator from a regular
Frame. - Border: It has a visible border that clearly delineates the group of widgets.
- Styling: Being a
ttkwidget, you can style it using themes and styles.
How to Create and Use a Labelframe
Let's break it down with code examples.

Basic Syntax and Creation
You create a Labelframe by specifying its parent (the window or frame it will live in) and its text.
import tkinter as tk
from tkinter import ttk
# Create the main window
root = tk.Tk()"Labelframe Example")
root.geometry("400x300")
# Create a Labelframe
# parent=root, text="Title"
labelframe = ttk.Labelframe(root, text="User Information")
labelframe.pack(padx=10, pady=10, fill="both", expand=True) # Pack it to make it visible
# You must add widgets to the labelframe, not directly to the root
# in this context. To do that, you first need to access its internal frame.
# The easiest way is to use the .pack() or .grid() method on the child widgets
# inside the labelframe.
# Add some widgets to the labelframe
label_name = ttk.Label(labelframe, text="Name:")
label_name.grid(row=0, column=0, padx=5, pady=5, sticky="w")
entry_name = ttk.Entry(labelframe)
entry_name.grid(row=0, column=1, padx=5, pady=5)
label_email = ttk.Label(labelframe, text="Email:")
label_email.grid(row=1, column=0, padx=5, pady=5, sticky="w")
entry_email = ttk.Entry(labelframe)
entry_email.grid(row=1, column=1, padx=5, pady=5)
root.mainloop()
Explanation:
ttk.Labelframe(root, text="User Information"): Creates the labelframe with the title "User Information".labelframe.pack(...): Places the labelframe in the main window.fill="both"andexpand=Truemake it grow with the window.grid(...): We use thegridgeometry manager inside thelabelframeto neatly arrange theLabelandEntrywidgets.
Common Options and Parameters
The Labelframe widget has several useful options:
| Option | Description |
|---|---|
text |
The title text for the frame. (e.g., text="Login Details") |
labelanchor |
Where to place the title relative to the border. Can be n, ne, e, se, s, sw, w, nw, or center. The default is nw (northwest). |
padding |
Adds space around the inside of the frame, between the border and the child widgets. Can be a single number or a tuple (left, top, right, bottom). |
borderwidth |
The width of the frame's border. Default is 2. |
relief |
The style of the border. Common values: flat, raised, sunken, groove, ridge. |
Example: Using labelanchor and padding
import tkinter as tk
from tkinter import ttk
root = tk.Tk()"Labelframe Options")
# Create a Labelframe with a title at the top-center and padding
labelframe = ttk.Labelframe(
root,
text="Settings",
labelanchor="n", # Place the title at the top-center
padding=(20, 10) # 20px horizontal padding, 10px vertical padding
)
labelframe.pack(padx=20, pady=20, fill="both")
# Add a widget inside
ttk.Label(labelframe, text="This text is inside the padded area.").pack()
root.mainloop()
Real-World Example: A Login Form
This example shows how to use multiple Labelframes to organize a more complex interface.
import tkinter as tk
from tkinter import ttk
# --- Main Application ---
app = tk.Tk()"Login Form")
app.geometry("400x450")
app.resizable(False, False)
# --- Login Credentials Frame ---
login_frame = ttk.Labelframe(app, text="Login Credentials", padding=20)
login_frame.pack(padx=20, pady=10, fill="x")
# Widgets inside the login_frame
ttk.Label(login_frame, text="Username:").grid(row=0, column=0, sticky="w", pady=5)
username_entry = ttk.Entry(login_frame)
username_entry.grid(row=0, column=1, sticky="ew", pady=5)
ttk.Label(login_frame, text="Password:").grid(row=1, column=0, sticky="w", pady=5)
password_entry = ttk.Entry(login_frame, show="*") # Hide password input
password_entry.grid(row=1, column=1, sticky="ew", pady=5)
# Configure grid column weights for resizing
login_frame.columnconfigure(1, weight=1)
# --- Preferences Frame ---
pref_frame = ttk.Labelframe(app, text="Preferences", padding=20)
pref_frame.pack(padx=20, pady=10, fill="x")
# Widgets inside the pref_frame
remember_var = tk.BooleanVar()
remember_check = ttk.Checkbutton(pref_frame, text="Remember me", variable=remember_var)
remember_check.pack(anchor="w", pady=5)
# --- Action Buttons ---
login_button = ttk.Button(app, text="Login", command=lambda: print("Login clicked!"))
login_button.pack(pady=20)
app.mainloop()
Output of this example: A window with two distinct sections:
- A "Login Credentials" box with username and password fields.
- A "Preferences" box with a "Remember me" checkbox. This separation makes the form much cleaner and easier to understand.
Styling Labelframe (Advanced)
Since ttk widgets are styleable, you can change their appearance.
import tkinter as tk
from tkinter import ttk
root = tk.Tk()"Styling Labelframe")
# Create a custom style
style = ttk.Style()
# Configure the style for the Labelframe
# 'TLabelframe' is the class name for the border/background
# 'TLabelframe.Label' is the class name for the title label
style.configure("Custom.TLabelframe", background="#f0f0f0", borderwidth=3, relief="ridge")
style.configure("Custom.TLabelframe.Label", background="#f0f0f0", font=("Helvetica", 12, "bold"))
# Create a labelframe and apply the custom style
styled_frame = ttk.Labelframe(
root,
text="Custom Styled Frame",
style="Custom.TLabelframe",
padding=15
)
styled_frame.pack(padx=20, pady=20, fill="both", expand=True)
ttk.Label(styled_frame, text="This frame has a custom style!").pack()
root.mainloop()
Summary: Labelframe vs. Frame
| Feature | ttk.Labelframe |
ttk.Frame |
|---|---|---|
| Purpose | To group related widgets and give the group a title. | To act as a general-purpose container for layout. |
| Use Case | Forms, option panels, settings dialogs, any UI section that needs a heading. | Complex window layouts, creating reusable widget components. |
In short: Use a Labelframe whenever you want to visually group widgets and give that group a name. Use a Frame for more generic layout tasks where a title is not needed.
