I discovered that in tkinter
, '<KP_Down>'
,'<KP_Up>'
, '<KP_Next>'
, '<KP_Prior>'
does not scroll a ttk.Treeview
widget as would '<KeyPress-Down>'
, '<KeyPress-Up>'
, '<KeyPress-Next>'
, '<KeyPress-Prior>'
respectively would by default? The sample code below shows these behaviours.
How do I let '<KP_Down>'
scroll the Treeview like how '<KeyPress-Next>'
does? The same question applies to '<KP_Up>'
, '<KP_Next>'
, '<KP_Prior>'
respective to '<KeyPress-Up>'
, '<KeyPress-Next>'
, '<KeyPress-Prior>'
.
import random
import tkinter as tk
import tkinter.ttk as ttk
class App(ttk.Frame):
def __init__(self, master, **kwargs):
super().__init__(master, **kwargs)
self.master = master
self.tree = None
self.ysb = None
self.xsb = None
self.create_widgets()
self.create_bindings()
def create_widgets(self):
self.tree = ttk.Treeview(
self.master, height=10, selectmode='extended', takefocus=True,
columns=("x", "y", "z"), displaycolumns=["x", "y", "z"])
self.tree.heading('#0', text="Points")
self.tree.heading('x', text='X', anchor='center')
self.tree.heading('y', text='Y', anchor='center')
self.tree.heading('z', text='Z', anchor='center')
self.tree.column('#0', stretch=True, width=100)
self.tree.column('x', stretch=True, anchor='center', width=50)
self.tree.column('y', stretch=True, anchor='center', width=50)
self.tree.column('z', stretch=True, anchor='center', width=50)
self.ysb = ttk.Scrollbar(
self.master, orient='vertical', command=self.tree.yview)
self.xsb = ttk.Scrollbar(
self.master, orient='horizontal', command=self.tree.xview)
self.tree.configure(
yscrollcommand=self.ysb.set, xscrollcommand=self.xsb.set)
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
self.tree.grid(row=0, column=0, sticky='nsew')
self.ysb.grid(row=0, column=1, sticky='ns')
self.grid(row=1, column=0, sticky='ew')
groups = ["Local", "Remote"]
for n, group in enumerate(groups):
self.tree.insert(
"", 'end', iid=f'G{n}', text=group, open=True)
for i in range(10):
self.tree.insert(
f'G{n}', 'end', iid=f'G{n}-D{i}',
text=f'G{n}-D{i}',
values=[
random.randrange(0, 20),
random.randrange(0, 20),
random.randrange(0, 20)
]
)
def create_bindings(self):
self.tree.bind('<KeyPress-Down>', self.kp_down)
self.tree.bind('<KeyPress-Up>', self.kp_up)
self.tree.bind('<KeyPress-Next>', self.kp_down)
self.tree.bind('<KeyPress-Prior>', self.kp_up)
self.tree.bind('<KP_Down>', self.kp_down)
self.tree.bind('<KP_Up>', self.kp_up)
self.tree.bind('<KP_Next>', self.kp_down)
self.tree.bind('<KP_Prior>', self.kp_up)
def kp_down(self, event):
print(f"{event.keysym}")
def kp_up(self, event):
print(f"{event.keysym}")
if __name__ == '__main__':
root = tk.Tk()
app = App(root)
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
app.grid(row=0, column=0, sticky='nsew')
root.mainloop()