简体   繁体   English

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

[英]Switch to ttk.TreeView with Tab key correctly

I have a Tkinter window that has a text box and the subclassed ttk.TreeView . 我有一个Tkinter窗口,其中有一个文本框和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. 当我尝试使用Tab键执行此操作时,似乎焦点不在切换到表格,而是切换到滚动条,因此在按上/下键时,滚动了表格内容,但未选择。 How to switch to the table itself using the Tab key? 如何使用Tab键切换到表格本身?

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: 首先,我禁用了滚动条,以避免额外按下Tab

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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