使用Tab键正确切换到ttk.TreeView

时间:2019-03-11 16:10:37

标签: python tkinter tk

我有一个Tkinter窗口,该窗口具有一个文本框和子类ttk.TreeView。运行程序时,我在文本框中输入文本,然后切换到树形视图。当我尝试使用Tab键执行此操作时,似乎焦点不在切换到表格,而是切换到滚动条,因此在按上/下键时,滚动了表格内容,但未选择。如何使用Tab键切换到表格本身?

工作示例:

#!/usr/bin/env python3                                                                                   
# -*- coding: utf-8 -*-                                                                                  
import tkinter as tk                                                                                     
import tkinter.ttk as ttk                                                                                

class TV(tk.Frame):                                                                                      

    def __init__(self, parent):                                                                          
        tk.Frame.__init__(self, parent)                                                                  
        self.CreateUI()                                                                                  
        self.LoadTable()                                                                                 
        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'] = ('Col1', 'Col2', 'Col3')                                                         
        tv.heading("#0", text='id')                                                                      
        tv.heading('Col1', text='Col1')                                                                  
        tv.heading('Col2', text='Col2')                                                                  
        tv.heading('Col3', text='Col3')                                                                  
        tv.grid(sticky = (tk.N,tk.S,tk.W,tk.E))                                                          
        self.treeview = tv                                                                               
        self.treeview.bind('<1>',self.OnClick)                                                           
        self.grid_rowconfigure(0, weight = 1)                                                            
        self.grid_columnconfigure(0, weight = 1)                                                         

    def LoadTable(self):                                                                                 
        for i in range(100):                                                                             
            self.treeview.insert('', 'end', iid=str(i+1), text='1', values=(2, 3, 4))                    
    def OnClick(self,event):                                                                             
        rowid=self.treeview.identify_row(event.y)                                                        
        self.treeview.selection_set(rowid)                                                               


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')                                                                      
ic_list=TV(root)                                                                                         
ic_list.grid(row=1,column=0,sticky='ns')                                                                 
sc.config(command=ic_list.treeview.yview)                                                                
ic_list.treeview.selection_set('1')                                                                                                             
filt.focus()                                                                                             
root.mainloop()

1 个答案:

答案 0 :(得分:0)

对自己和感兴趣的人进行解答。首先,我已将焦点集中在滚动条上,以避免额外按下Tab

sc=tk.Scrollbar(root, takefocus=0)

然后,我为this的答案添加了一个用于获得焦点的处理程序:

def on_get_focus(self, event):
    self.treeview.selection_set(self.treeview.get_children('')[0]) #set selection on the first item
    self.treeview.focus_set()
    self.treeview.focus(self.treeview.get_children('')[0])
    # here I added the code for OnClick event

# in CreateUI()
self.bind('<FocusIn>',self.on_get_focus)