[英]Switch to ttk.TreeView with Tab key correctly
我有一个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()
回答自己和那些感兴趣的人。 首先,我禁用了滚动条,以避免额外按下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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.