Переключитесь на ttk.TreeView с клавишей Tab правильно - PullRequest
0 голосов
/ 11 марта 2019

У меня есть окно 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 голосов
/ 11 марта 2019

Отвечаю себе и тем, кому интересно. Во-первых, я отключил фокус на полосе прокрутки, чтобы избежать дополнительных Tab нажатий:

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

Затем я добавил обработчик для получения фокуса, благодаря этому ответу:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...