Ttk Treeview:跟踪键盘选择

时间:2018-03-19 09:26:21

标签: python tkinter treeview

这是一个带有ttk树视图的Tk小部件。当用户点击该行时,会执行某些功能(此处只打印项目文本)。我需要的是以下内容:

  1. 最初的重点是文本输入。当用户按下Tab键时,焦点应该转到第一行,并且应该执行绑定到Click事件的函数。
  2. 当用户使用键盘在树视图中上下移动时,一旦选择了下一个单元格,也应该执行此功能。
  3. 我找不到与这些问题相关的任何内容。 ttk treeview是否能够跟踪键盘?感谢。

    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('<1>',self.OnClick)
    
        def OnClick(self,event):
            rowid=self.treeview.identify_row(event.y)
            self.treeview.selection_set(rowid)
            it=self.treeview.selection()[0]
            print(self.treeview.item(it,'values')[0])
    
    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()
    

1 个答案:

答案 0 :(得分:2)

当我从评论中读到时,您需要一些函数来从树视图中提取当前选择(或其中的一部分),对选择的另一个树视图执行触发操作。

因此,您可以完美地使用虚拟<<TreeviewSelect>> - 事件@CommonSense建议。

根据documentation

45.1。 ttk.Treeview小部件的虚拟事件

Treeview小部件中的某些状态更改会生成可用于响应这些更改的虚拟事件;请参见第54.8节“虚拟事件”。

      
  • 每当选择项发生变化时,无论是选择项目还是取消选择项目,窗口小部件都会生成“&lt;&lt;&lt;&lt;&gt; TreeviewSelect&gt;&gt;”事件。
  •   
  • 每当打开一个项目时,该小部件都会生成一个“&lt;&lt;&lt;&lt; TreeviewOpen&gt;&gt;”事件。
  •   
  • 每当项目关闭时,窗口小部件都会生成“&lt;&lt;&lt;&lt;&lt; TreeviewClose&gt;&gt;”事件。

然后使用ttk.treeview.focus()获取当前选定的iidttk.treeview.item(ttk.treeview.focus())将为您提供操作所需的项目。