簡體   English   中英

Ttk Treeview:跟蹤鍵盤選擇

[英]Ttk Treeview: track keyboard selection

這是帶有ttk樹視圖的Tk小部件。 當用戶單擊該行時,將執行某些功能(此處僅打印項目文本)。 我需要的是以下內容:

  1. 最初,重點是文本輸入。 當用戶按下Tab鍵時,焦點應移至第一行,並且應執行綁定到Click事件的功能。
  2. 當用戶使用鍵盤在樹狀視圖中上下移動時,一旦選擇了下一個單元格,則也應執行此功能。

我找不到與這些問題有關的任何東西。 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()

正如我從評論中看到的那樣,您需要一些功能來從樹視圖中提取當前選擇(或其中的一部分),並對選擇上的另一個樹視圖執行觸發操作。

因此,您可以完美使用建議的虛擬<<TreeviewSelect>> -Event @CommonSense。

根據文檔

45.1。 ttk.Treeview小部件的虛擬事件

Treeview小部件內的某些狀態更改會生成虛擬事件,您可以使用這些事件來響應這些更改。 請參見第54.8節“虛擬事件”。

  • 每當選擇發生更改時,無論是通過選擇項還是未選擇項,小部件都會生成“ <&ltTreeviewSelect >>”事件。
  • 每當打開項目時,小部件都會生成一個“ <&ltTreeviewOpen >>”事件。
  • 每當關閉項目時,小部件都會生成“ <&ltTreeviewClose >>”事件。

然后使用ttk.treeview.focus()獲得當前選擇的iid ttk.treeview.item(ttk.treeview.focus())將為您提供您需要進行操作的項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM