简体   繁体   中英

Switch to ttk.TreeView with Tab key correctly

I have a Tkinter window that has a text box and the subclassed ttk.TreeView . When I run the program, I input text in the text box and switch to the treeview. When I'm trying to do that with the Tab key, it seems that the focus is switching not to the table, but to the scrollbar, so when pressing up/down keys, table contents are scrolled, but not choosed. How to switch to the table itself using the Tab key?

Working example:

#!/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()

Answering to myself and those who is interested. First, I've disabled focus on a scrollbar to avoid extra Tab pressing:

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

Then I've added a handler for getting focus, thanks to this answer:

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM