16

My environment is Windows 7 using Python 64-bit 3.4. I am trying to attach a scrollbar to a treeview widget. I have tried several versions but have been unable to get it to work. What I have tried so far:

# treeview example
from tkinter import ttk
from tkinter import *

# Create instance
win = Tk()

# Add a title       
    win.title("Treeview Test")

# Add a treeview
    tree = ttk.Treeview(win,selectmode='browse')
    vsb = ttk.Scrollbar(orient="vertical",command=tree.yview)
    tree.configure(yscrollcommand=vsb.set)

    tree.place(x = 30, y = 95)
    tree["columns"] = ("1", "2")
    tree['show'] = 'headings'
    tree.column("1", width=100, anchor='c')
    tree.column("2", width=100, anchor='c')
    tree.heading("1", text="Account")
    tree.heading("2", text="Type")
    tree.insert("",'end',text="L1",values=("Big1","Best"))
    tree.insert("",'end',text="L2",values=("Big2","Best"))
    tree.insert("",'end',text="L3",values=("Big3","Best"))
    tree.insert("",'end',text="L4",values=("Big4","Best"))
    tree.insert("",'end',text="L5",values=("Big5","Best"))
    tree.insert("",'end',text="L6",values=("Big6","Best"))
    tree.insert("",'end',text="L7",values=("Big7","Best"))
    tree.insert("",'end',text="L8",values=("Big8","Best"))
    tree.insert("",'end',text="L9",values=("Big9","Best"))
    tree.insert("",'end',text="L10",values=("Big10","Best"))
    tree.insert("",'end',text="L11",values=("Big11","Best"))
    tree.insert("",'end',text="L12",values=("Big12","Best"))

# Set Window Form Size and disable resizing
    win.minsize(width=1200,height=600)
    win.resizable(width=0,height=0)  

# Event Loop
    win.mainloop()
    quit()
Stephen Rauch
  • 47,830
  • 31
  • 106
  • 135
Steve Baker
  • 181
  • 2
  • 2
  • 6

3 Answers3

27

You have to place() your scrollbar in window.

from tkinter import ttk
import tkinter as tk

win = tk.Tk()
win.minsize(width=300, height=400)
win.resizable(width=0, height=0)

tree = ttk.Treeview(win, selectmode='browse')
tree.place(x=30, y=95)

vsb = ttk.Scrollbar(win, orient="vertical", command=tree.yview)
vsb.place(x=30+200+2, y=95, height=200+20)

tree.configure(yscrollcommand=vsb.set)

tree["columns"] = ("1", "2")
tree['show'] = 'headings'
tree.column("1", width=100, anchor='c')
tree.column("2", width=100, anchor='c')
tree.heading("1", text="Account")
tree.heading("2", text="Type")
tree.insert("",'end',text="L1",values=("Big1","Best"))
tree.insert("",'end',text="L2",values=("Big2","Best"))
tree.insert("",'end',text="L3",values=("Big3","Best"))
tree.insert("",'end',text="L4",values=("Big4","Best"))
tree.insert("",'end',text="L5",values=("Big5","Best"))
tree.insert("",'end',text="L6",values=("Big6","Best"))
tree.insert("",'end',text="L7",values=("Big7","Best"))
tree.insert("",'end',text="L8",values=("Big8","Best"))
tree.insert("",'end',text="L9",values=("Big9","Best"))
tree.insert("",'end',text="L10",values=("Big10","Best"))
tree.insert("",'end',text="L11",values=("Big11","Best"))
tree.insert("",'end',text="L12",values=("Big12","Best"))

win.mainloop()

enter image description here

But place() needs manual calculations of x and y. It is easier to use pack()

from tkinter import ttk
import tkinter as tk

win = tk.Tk()
win.resizable(width=0, height=0)

tree = ttk.Treeview(win, selectmode='browse')
tree.pack(side='left')

vsb = ttk.Scrollbar(win, orient="vertical", command=tree.yview)
vsb.pack(side='right', fill='y')

tree.configure(yscrollcommand=vsb.set)

tree["columns"] = ("1", "2")
tree['show'] = 'headings'
tree.column("1", width=100, anchor='c')
tree.column("2", width=100, anchor='c')
tree.heading("1", text="Account")
tree.heading("2", text="Type")
tree.insert("",'end',text="L1",values=("Big1","Best"))
tree.insert("",'end',text="L2",values=("Big2","Best"))
tree.insert("",'end',text="L3",values=("Big3","Best"))
tree.insert("",'end',text="L4",values=("Big4","Best"))
tree.insert("",'end',text="L5",values=("Big5","Best"))
tree.insert("",'end',text="L6",values=("Big6","Best"))
tree.insert("",'end',text="L7",values=("Big7","Best"))
tree.insert("",'end',text="L8",values=("Big8","Best"))
tree.insert("",'end',text="L9",values=("Big9","Best"))
tree.insert("",'end',text="L10",values=("Big10","Best"))
tree.insert("",'end',text="L11",values=("Big11","Best"))
tree.insert("",'end',text="L12",values=("Big12","Best"))

win.mainloop()

enter image description here

You can always put Treeview and Scrollbar in Frame and then move this frame with place(), pack() or grid() in better place.

furas
  • 134,197
  • 12
  • 106
  • 148
  • 1
    My two coins about `grid` manager. When adding a scrollbar for a `Treeview` (perhaps, for any widget), use `sticky` parameter. In my case, on MacOS ([built-in style theme](https://wiki.tcl-lang.org/page/List+of+ttk+Themes) aqua) scrollbar *looked* like sticky, but it was unresponsive until I add `sticky` parameter. After that, the scroll and the view became binded. – Stepan Zakharov Jul 06 '22 at 14:12
1

After creating your widgets, you need to place or lay out your widgets on the Tk window. The Layout Manager available in tkinter are grid, pack and place. Check them out and add them to your widgets.

Sun Bear
  • 7,594
  • 11
  • 56
  • 102
0
import tkinter as tk
from tkinter.ttk import Treeview, Scrollbar

top = tk.Tk()
top.geometry('1400x800')
top.configure(background="#f7f7f7")

# treeview initialization
treeview = Treeview(top)

# scrollbars
vsb = Scrollbar(top, orient="vertical", command=treeview.yview)
vsb.place(relx=0.978, rely=0.175, relheight=0.713, relwidth=0.020)

hsb = Scrollbar(top, orient="horizontal", command=treeview.xview)
hsb.place(relx=0.014, rely=0.875, relheight=0.020, relwidth=0.965)

treeview.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set)

May be this can help you.