Zaznaczanie wierszy przy pomocy przycisków Ctrl+Enter w Treeview.

0

Witam serdecznie,

ostatnio walczę z problemem zaznaczania wierszy w w Treeview jeden po drugim przy użyciu klawiatury. Doszedłem jak zaznaczyć skrótem na klawiaturze wszystkie wiersze ale nie potrafię sobie poradzić z zaznaczaniem wierszy pojedynczo. Czy ktoś mógłby dać mi jakieś wskazówki w moim kodzie.

import tkinter as tk
import tkinter.ttk as ttk

class App(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.CreateUI()
        self.grid(sticky = (tk.N,tk.S,tk.W,tk.E))
        parent.grid_rowconfigure(0, weight = 1)
        parent.grid_columnconfigure(0, weight = 1)

    def CreateUI(self):
        tv = ttk.Treeview(self,yscrollcommand=sc.set,height=30)
        tv['columns'] = ('Name',)
        tv.heading("#0", text='Items')
        tv.column("#0", anchor="w",width=75)
        tv.heading('Name', text='Name')
        tv.column('Name', anchor='w', width=150)
        tv.grid(sticky = (tk.N,tk.S,tk.W,tk.E))
        self.treeview = tv
        self.treeview.bind('<Control-Enter>',self.OnClick)

    def OnClick(self,event):
        rows = self.treeview.get_children()
        for row in rows:
            self.treeview.selection_add(row)
              
items=[]
for i in range(100):
    items.append([i,'Item %d' % i])

root=tk.Tk()
sv=tk.StringVar()
filt=tk.Entry(root,textvariable=sv)
filt.grid(row=0,column=0,sticky='nw')
sc=tk.Scrollbar(root)
sc.grid(row=1,column=1,sticky='ns')
item_list=App(root)
item_list.grid(row=1,column=0,sticky='ns')
sc.config(command=item_list.treeview.yview)
for i in range(len(items)):
    item_list.treeview.insert('', 'end', iid=str(i), text=items[i][0], values=(items[i][1],))
item_list.treeview.selection_set('0')

def update_filter(*args):
    global items,item_list,sv
    filtr=sv.get().lower()
    item_list.treeview.delete(*(item_list.treeview).get_children())
    for i in range(len(items)):
        if filtr in str(items[i][0]).lower() or filtr in str(items[i][1]).lower():
            item_list.treeview.insert('', 'end', iid=str(i), text=items[i][0], values=(items[i][1],))
    item_list.treeview.update()
    item_list.update()

sv.trace('w', update_filter)
filt.focus()
root.mainloop()
0

Jeśli dobrze rozumiem Twój problem chcesz dodać np. coś takiego?

        self.treeview.bind('<Shift-Down>',self.OnShiftDown)

    def OnShiftDown(self,event):
        focus_idx = int(self.treeview.focus())
        next_idx = str(focus_idx + 1)
        self.treeview.selection_add(next_idx)
        self.treeview.focus(next_idx)
        return 'break'

1 użytkowników online, w tym zalogowanych: 0, gości: 1