Ttk Treeview:跟踪键盘选择 [英] Ttk Treeview: track keyboard selection

查看:37
本文介绍了Ttk Treeview:跟踪键盘选择的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Here is a Tk widget with a ttk treeview. When user clicks on the row, some function is executed (here it just prints item text). What I need is the following:

  1. 最初关注的是文本条目.当用户按下 Tab 键时,焦点应该转到第一行,并且应该执行绑定到 Click 事件的函数.
  2. 当用户使用键盘在树视图中上下移动时,一旦选择了下一个单元格,也应执行此功能.

我找不到与这些问题相关的任何内容.ttk treeview 是否能够跟踪键盘?谢谢.

I can't find anything related to these questions. Is ttk treeview capable to track keyboard? Thanks.

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()

推荐答案

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

As I read from the comments, you need some function to extract the current selection (or a part of that) from your treeview, execute a trigger action for another treeview on the selection.

因此您可以完美地使用虚拟 <<>-Event @CommonSense 建议.

Therefore you can perfectly use the virtual <<TreeviewSelect>>-Event @CommonSense suggested.

根据文档:

  • Whenever there is a change in the selection, either by items becoming selected or becoming unselected, the widget generates a <<TreeviewSelect>>" event.
  • 每当打开一个项目时,小部件都会生成一个<<TreeviewOpen>>"事件.
  • 每当项目关闭时,小部件都会生成<<TreeviewClose>>"事件.

然后使用ttk.treeview.focus()获取当前选中的iid.ttk.treeview.item(ttk.treeview.focus()) 会给你需要操作的项目.

Then use ttk.treeview.focus() to get the currently selected iid. ttk.treeview.item(ttk.treeview.focus()) will give you the item you need to operate on.

这篇关于Ttk Treeview:跟踪键盘选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆