Python 如何将焦点设置在tkinter TreeView列表的第一行

Python 如何将焦点设置在tkinter TreeView列表的第一行,python,tkinter,treeview,ttk,ttkwidgets,Python,Tkinter,Treeview,Ttk,Ttkwidgets,我希望设置树中第一行的焦点突出显示状态,以便用户只需使用箭头向下或向上移动,而无需首先选择一行。默认值应突出显示第0行。下面是一个示例程序。它允许用户用鼠标左键选择一行,然后弹出一个窗口,显示该行的详细信息 欢迎所有建议。谢谢 from tkinter import * from tkinter import ttk import tkinter as tk # Display selected row def msgwindow(xrow): curitem = tree.item

我希望设置树中第一行的焦点突出显示状态,以便用户只需使用箭头向下或向上移动,而无需首先选择一行。默认值应突出显示第0行。下面是一个示例程序。它允许用户用鼠标左键选择一行,然后弹出一个窗口,显示该行的详细信息

欢迎所有建议。谢谢

from tkinter import *
from tkinter import ttk
import tkinter as tk


# Display selected row
def msgwindow(xrow):
    curitem = tree.item(tree.focus())
    rowinfo=Toplevel(root) # Child window
    rowinfo.geometry("500x200")  # Size of the window
    rowinfo.title("selected row")
    row_str = tk.StringVar()
    l1 = tk.Label(rowinfo,  textvariable=row_str )
    l1.grid(row=1, column=0)
    row_str.set(curitem['values'][0] + ', ' + curitem['values'][1] + ', ' + curitem['values'][2])
    # Exit selected row window
    def exit_rowinfo(event):
        rowinfo.destroy()

    rowinfo.bind('<Return>', exit_rowinfo)

    # Define exit window button
    rowinfo_back_button = tk.Button(rowinfo, text='Back', padx=20, pady=10, command=lambda: exit_rowinfo(1))
    rowinfo_back_button.grid(row=0, column=1)

# End program
def exit_root(event):
    root.destroy()

tree_columns=('#1', '#2', '#3')

root = Tk()
tree = ttk.Treeview(root, columns=tree_columns, show='headings')
tree.heading('#1', text='First Name')
tree.heading('#2', text='Last Name')
tree.heading('#3', text='Email')
tree.column('#1', width=150)
tree.column('#2', width=150)
tree.column('#3', width=250)

# Define exit window button
tree_exit_button = tk.Button(root, text='Exit', padx=20, pady=10, command=lambda: exit_root(1))
tree_exit_button.grid(row=0, column=6, sticky=N + W)

# generate sample data
def generatetestdata(xtree, xnum):
    contacts = []
    for n in range(1, xnum+1):
        contacts.append((f'first {n}', f'last {n}', f'email{n}@example.com'))
    # adding data to the frame2 tree
    for contact in contacts:
        xtree.insert('', tk.END, values=contact)

generatetestdata(tree, 5)

tree.grid()
tree.bind('<ButtonRelease-1>', msgwindow)
root.bind('<Return>', exit_root)

root.mainloop()


您可以使用focus_set将焦点作为一个整体设置在小部件上。要将树焦点设置为特定项,您可以在treeview上调用focus方法,将您想要焦点的项传递给它

然而,这听起来像是在问除了设置焦点之外如何设置选择。仅仅设置焦点并不会改变项目的突出显示状态。为此,您需要使用selection_set设置选择

要想做你想做的事,你必须做以下三件事:

将整个键盘焦点设置为树,以便向树发送按键事件 将内部树焦点设置为第一个项目,因为树会将它接收到的所有键盘事件发送到焦点项目 将所选内容设置为第一项,使其高亮显示。 例如:

tree.focus_set()
children = tree.get_children()
if children:
    tree.focus(children[0])
    tree.selection_set(children[0])

杰出的这正是我需要的。非常感谢。