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.