Home > Mobile >  How to create Tkinter Tab frame with different (dynamic) heights
How to create Tkinter Tab frame with different (dynamic) heights

Time:07-16

I am trying to create Tabs in python tkinter. I would like the Tab's height to size dynamically based on its content. Below is a sample of my code

from tkinter import *
from tkinter import ttk

root = Tk()
root.title('Frames')
root.geometry('500x500')

frame1 = LabelFrame(root)
frame1.pack(padx=5, pady = 5)

notebook1 = ttk.Notebook(frame1)
notebook1.pack(pady= 5)

nbframe1 = Frame(notebook1, bg = 'white')
nbframe2 = Frame(notebook1, bg = 'grey')

nbframe1.pack(fill ='both', expand=1)
nbframe2.pack(fill ='both', expand=1)

notebook1.add(nbframe1, text= 'A Search')
notebook1.add(nbframe2, text= 'B Search')

a_label = Label(nbframe1, text= 'A_Tag', bg = 'white')
a_label.grid(row = 0, column = 0, sticky=W, padx=5)
b_label = Label(nbframe1, text= 'B_Tag', bg = 'white')
b_label.grid(row = 1, column = 0, sticky=W, padx=5)

a_text = StringVar()
a_entry = Entry(nbframe1, textvariable =  a_text, width=50)
a_entry.grid(row = 0, column = 1, sticky=W, padx=5)
b_text = StringVar()
b_entry = Entry(nbframe1, textvariable = b_text, width=25)
b_entry.grid(row = 1, column = 1, sticky=W, padx=5)

root.mainloop()

From my code, the Tabs created have same height even though one is empty. This is based on the height of the Tab with content. How can i set it so that each Tab's height is based only on the contents.

screenshot first tabscreenshot second tab

CodePudding user response:

You can bind a function to the virtual event <<NotebookTabChanged>> to adapt the height of the notebook to the currently selected tab using the height option of the notebook:

def on_change_tab(event):
    tab = event.widget.nametowidget(event.widget.select())  # get selected tab
    event.widget.configure(height=tab.winfo_reqheight())    # resize notebook

With your example:

from tkinter import *
from tkinter import ttk

root = Tk()
root.title('Frames')
root.geometry('500x500')

def on_change_tab(event):
    tab = event.widget.nametowidget(event.widget.select())
    event.widget.configure(height=tab.winfo_reqheight())

frame1 = LabelFrame(root)
frame1.pack(padx=5, pady=5)

notebook1 = ttk.Notebook(frame1)
notebook1.pack(pady=5)

nbframe1 = Frame(notebook1, bg='white')
nbframe2 = Frame(notebook1, bg='grey')

notebook1.add(nbframe1, text='A Search')
notebook1.add(nbframe2, text='B Search')

a_label = Label(nbframe1, text='A_Tag', bg='white')
a_label.grid(row=0, column=0, sticky=W, padx=5)
b_label = Label(nbframe1, text='B_Tag', bg='white')
b_label.grid(row=1, column=0, sticky=W, padx=5)

a_text = StringVar()
a_entry = Entry(nbframe1, textvariable=a_text, width=50)
a_entry.grid(row=0, column=1, sticky=W, padx=5)
b_text = StringVar()
b_entry = Entry(nbframe1, textvariable=b_text, width=25)
b_entry.grid(row=1, column=1, sticky=W, padx=5)

root.update_idletasks()  # force display update so that the initial tab is displayed correctly 
notebook1.bind('<<NotebookTabChanged>>', on_change_tab)  # binding to update the height
root.mainloop()
  • Related