Search code examples
canvastkinterresizettk

ttk.Notebook tab with Canvas, expanding to fill the window


I have a simple GUI that has three Frames. One of those frames is a Notebook frame containing a canvas. The problem is the Notebook frame doesn't expand to fit the window. I've tried all different combinations of grid() and pack(). Nothing seems to work for me. So I've finally come here. I hope someone here can tell me what I'm doing wrong. Included is a stripped down version of my code:

    from tkinter import *
import ttk

window = Tk()
window.geometry("640x480")
window.title("Notebook Test")

options_list = ["one", "two", "three"]

def doNothing():
    pass

leftFrame = Frame(window)
tabFrame = Frame(window)
statusFrame = Frame(window)

leftFrame.grid(row=0, column=0, sticky="n")
tabFrame.grid(row=0, column=1, sticky="nw")
statusFrame.grid(row=2, column=0, columnspan=2, sticky="ew")

Xlabel = Label(leftFrame, text="X Function", anchor=N)
Xlabel.pack()
x_var = StringVar(leftFrame)
x_menu = ttk.Combobox(leftFrame, textvariable=x_var)
x_menu["values"] = options_list
x_menu.current(0)
x_menu.pack()

tab_control = ttk.Notebook(tabFrame)
tab1 = ttk.Frame(tab_control)
tab2 = ttk.Frame(tab_control)
tab_control.add(tab1, text="Default One")
tab_control.add(tab2, text="Default Two")
tab_control.grid()

canvas1 = Canvas(tab1, bg="blue")
canvas2 = Canvas(tab2, bg="green")

canvas1.grid()
canvas2.grid()

tab_control.bind("<ButtonPress-1>", doNothing, True)
tab_control.bind("<ButtonPress-2>", doNothing, True)
tab_control.bind("<ButtonPress-3>", doNothing, True)

status = Label(statusFrame, text = "Status:", bd=1, relief=SUNKEN, anchor=W)
status.pack(fill=X, expand=True)

window.grid_rowconfigure(1, weight=1)
window.grid_columnconfigure(1, weight=1)

window.mainloop()

Here is a picture of what I currently have:

Notebook Frame that won't resize

As you can see, the "blue" part should fill much more of the window.

Thanks!


Solution

  • Just pass height and width to your notebook widget:

    tab_control = ttk.Notebook(tabFrame,height=480,width=495)
    

    To have your tab scales, bind a <Configure> event to your root window:

    def conf(event):
        tab_control.config(height=window.winfo_height(),width=window.winfo_width()-145)
    
    window.bind("<Configure>",conf)