我有一个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()
答案 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)