How do you overlap widgets/frames in Python tkinter?

In Tkinter, you can overlap widgets or frames using the place() geometry manager. Unlike pack() and grid(), the place() manager allows precise positioning using absolute or relative coordinates, making it perfect for overlapping elements.

Basic Widget Overlapping

The place() geometry manager positions widgets using x and y coordinates. To overlap widgets, simply place them at the same or overlapping coordinates ?

import tkinter as tk

# Create the main window
root = tk.Tk()
root.geometry("400x300")
root.title("Overlapping Widgets")

# Create first label (background)
label1 = tk.Label(root, text="Background Label", bg="lightblue", 
                  font=("Arial", 16), width=20, height=3)
label1.place(x=50, y=50)

# Create second label (overlapping)
label2 = tk.Label(root, text="Overlapping Label", bg="lightcoral", 
                  font=("Arial", 14), width=15, height=2)
label2.place(x=100, y=80)

root.mainloop()

Overlapping Frames with Widgets

Here's how to overlap frames containing different widgets ?

import tkinter as tk
from tkinter import ttk

# Create main window
win = tk.Tk()
win.geometry("500x400")
win.title("Overlapping Frames")

# Create first frame
frame1 = tk.Frame(win, bg="lightpink", width=200, height=150)
frame1.place(x=100, y=50)

# Add label to first frame
tk.Label(frame1, text="Welcome Folks!", 
         font=("Arial", 14, "bold"), bg="white").place(x=20, y=20)

# Create second frame (overlapping)
frame2 = tk.Frame(win, bg="lightgreen", width=180, height=120)
frame2.place(x=150, y=100)

# Add button to second frame
ttk.Button(frame2, text="Click Me!").place(x=50, y=40)

win.mainloop()

Using Relative Positioning

You can also use relative positioning with relx and rely parameters for responsive overlapping ?

import tkinter as tk

root = tk.Tk()
root.geometry("400x300")

# Background widget using relative positioning
bg_label = tk.Label(root, text="Background", bg="yellow", 
                   font=("Arial", 20))
bg_label.place(relx=0.5, rely=0.5, anchor="center")

# Overlapping widget
overlay_button = tk.Button(root, text="Overlay Button", bg="red", fg="white")
overlay_button.place(relx=0.5, rely=0.5, anchor="center")

root.mainloop()

Key Parameters for place()

Parameter Description Example
x, y Absolute coordinates x=50, y=100
relx, rely Relative coordinates (0.0 to 1.0) relx=0.5, rely=0.3
anchor Widget alignment point anchor="center"
width, height Fixed size width=200, height=100

Controlling Widget Stacking Order

Widgets placed later appear on top. To change stacking order, use lift() and lower() methods ?

import tkinter as tk

root = tk.Tk()
root.geometry("300x250")

# Create overlapping labels
label1 = tk.Label(root, text="Bottom Layer", bg="blue", fg="white", 
                 font=("Arial", 12), width=15, height=3)
label1.place(x=50, y=50)

label2 = tk.Label(root, text="Top Layer", bg="red", fg="white", 
                 font=("Arial", 12), width=12, height=2)
label2.place(x=80, y=70)

# Button to change stacking order
def bring_bottom_to_front():
    label1.lift()

tk.Button(root, text="Bring Blue to Front", 
         command=bring_bottom_to_front).place(x=100, y=150)

root.mainloop()

Conclusion

Use the place() geometry manager to overlap widgets in Tkinter by setting the same or overlapping coordinates. Combine absolute positioning with relative positioning for flexible layouts, and use lift() and lower() methods to control stacking order.

Updated on: 2026-03-25T22:26:51+05:30

5K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements