Jero
Jero

Reputation: 105

Can't resize treeview with grid on tkinter

I am unable to resize the treeview widget on tkinter with a grid layout. I tried using columnconfigure and rowconfigure with weight but it does not work. When I run it, the treeview does not fill the empty space when I stretch the window it is in.

def __init__(self, master):
    self.master = master
    tk.Frame.__init__(self, self.master)
    self.create_widgets()

def create_widgets(self):
    # button to request data
    self.request_button = tk.Button(root, text="Send", command=self.req_client)
    self.request_button.grid(row=0, column=0, rowspan=2, columnspan=3)

    # timer label
    self.timer_label = tk.Label(root, text="Timer Settings")
    self.timer_label.grid(row=0, column=3, columnspan=2, pady=3, sticky=tk.NSEW)

    # create tk variable
    self.timervar = tk.StringVar(root)

    # dropdown dictionary
    self.timerDict = {"-", "5 minutes", "10 minutes", "15 minutes"}
    self.timervar.set("-")  # <-- set the default value

    # timer dropdown menu
    self.timer_option = tk.OptionMenu(root, self.timervar, *self.timerDict, command=self.req_timer)
    self.timer_option.grid(row=1, column=3, columnspan=2, padx=3, pady=3, sticky=tk.NSEW)

    # scroll bar for the terminal outputs
    self.terminal_scrollbar = tk.Scrollbar(root)
    self.terminal_scrollbar.grid(row=2, column=5, sticky=tk.NS)

    # terminal output
    self.terminal_tree = ttk.Treeview(root)
    self.terminal_tree.grid(row=2, column=0, columnspan=5, sticky=tk.NSEW)
    self.terminal_tree.configure(yscrollcommand=self.terminal_scrollbar.set)
    self.terminal_tree.columnconfigure(0, weight=1)
    self.terminal_tree.rowconfigure(0, weight=1)
    self.terminal_tree["columns"] = ("1")
    self.terminal_tree['show'] = 'headings'
    self.terminal_tree.column("1", width=100, anchor='c')
    self.terminal_tree.heading("1", text="Example")

Upvotes: 1

Views: 7333

Answers (1)

furas
furas

Reputation: 143197

First: if you use Frame to create class then you should use this frame (self) as parent for widgets (instead of using root)

After that ...

Second: you have to resize Frame (self) so it will use full window

self.pack(fill='both', expand=True)

Because Treeview is inside Frame then you have to use columnconfigure with Frame

self.columnconfigure(0, weight=1) # column with treeview
self.rowconfigure(2, weight=1) # row with treeview  

Working example. I commented command= to run it.

(BTW: I used bg="red" in Frame to see if Frame is resizing)

import tkinter as tk
from tkinter import ttk

class Main(tk.Frame):

    def __init__(self, master):
        self.master = master
        tk.Frame.__init__(self, self.master) # , bg="red")

        self.pack(fill='both', expand=True)

        self.create_widgets()

    def create_widgets(self):
        # button to request data
        self.request_button = tk.Button(self, text="Send") #, command=self.req_client)
        self.request_button.grid(row=0, column=0, rowspan=2, columnspan=3)

        # timer label
        self.timer_label = tk.Label(self, text="Timer Settings")
        self.timer_label.grid(row=0, column=3, columnspan=2, pady=3, sticky=tk.NSEW)

        # create tk variable
        self.timervar = tk.StringVar(self)

        # dropdown dictionary
        self.timerDict = {"-", "5 minutes", "10 minutes", "15 minutes"}
        self.timervar.set("-")  # <-- set the default value

        # timer dropdown menu
        self.timer_option = tk.OptionMenu(self, self.timervar, *self.timerDict) #, command=self.req_timer)
        self.timer_option.grid(row=1, column=3, columnspan=2, padx=3, pady=3, sticky=tk.NSEW)

        # scroll bar for the terminal outputs
        self.terminal_scrollbar = tk.Scrollbar(self)
        self.terminal_scrollbar.grid(row=2, column=5, sticky=tk.NS)

        # terminal output
        self.terminal_tree = ttk.Treeview(self)
        self.terminal_tree.grid(row=2, column=0, columnspan=5, sticky=tk.NSEW)
        self.terminal_tree.configure(yscrollcommand=self.terminal_scrollbar.set)
        self.terminal_tree["columns"] = ("1")
        self.terminal_tree['show'] = 'headings'
        self.terminal_tree.column("1", width=100, anchor='c')
        self.terminal_tree.heading("1", text="Example")

        self.columnconfigure(0, weight=1) # column with treeview
        self.rowconfigure(2, weight=1) # row with treeview        

root = tk.Tk()
Main(root)
root.mainloop()

You may have to use frame inside first row to better organize button and optionmenu.

enter image description here


EDIT: after changing options in some grid() and changing rowconfigure()

enter image description here

import tkinter as tk
from tkinter import ttk

class Main(tk.Frame):

    def __init__(self, master):
        self.master = master
        tk.Frame.__init__(self, self.master) # , bg="red")

        self.pack(fill='both', expand=True)

        self.create_widgets()

    def create_widgets(self):
        # button to request data
        self.request_button = tk.Button(self, text="Send") #, command=self.req_client)
        self.request_button.grid(row=0, column=0, rowspan=2)

        # timer label
        self.timer_label = tk.Label(self, text="Timer Settings")
        self.timer_label.grid(row=0, column=1, pady=3, sticky=tk.NSEW)

        # create tk variable
        self.timervar = tk.StringVar(self)

        # dropdown dictionary
        self.timerDict = {"-", "5 minutes", "10 minutes", "15 minutes"}
        self.timervar.set("-")  # <-- set the default value

        # timer dropdown menu
        self.timer_option = tk.OptionMenu(self, self.timervar, *self.timerDict) #, command=self.req_timer)
        self.timer_option.grid(row=1, column=1, padx=3, pady=3, sticky=tk.NSEW)

        # scroll bar for the terminal outputs
        self.terminal_scrollbar = tk.Scrollbar(self)
        self.terminal_scrollbar.grid(row=2, column=5, sticky=tk.NS)

        # terminal output
        self.terminal_tree = ttk.Treeview(self)
        self.terminal_tree.grid(row=2, column=0, columnspan=3, sticky=tk.NSEW)
        self.terminal_tree.configure(yscrollcommand=self.terminal_scrollbar.set)
        self.terminal_tree["columns"] = ("1")
        self.terminal_tree['show'] = 'headings'
        self.terminal_tree.column("1", width=100, anchor='c')
        self.terminal_tree.heading("1", text="Example")

        self.columnconfigure(2, weight=1) # column with treeview
        self.rowconfigure(2, weight=1) # row with treeview        

root = tk.Tk()
Main(root)
root.mainloop()

Upvotes: 4

Related Questions