[英]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.