簡體   English   中英

鼠標懸停時如何更改行顏色? Tkinter Treeview

[英]How to change row color when mouse over? Tkinter Treeview

我最近一直在使用 Tkinter ttk.Treeview 小部件,我已經能夠使用ttk.Style更改很多小部件的樣式,但遺憾的是我無法找到解決此問題的方法:

光標/鼠標結束時如何更改項目的顏色?

就像 Tkinter.Button 的activebackground選項Tkinter.Button 與 VS CODE treeview 一樣:當您瀏覽資源管理器時,cursor 下的文件/文件夾會更改背景顏色。

你可以用一個標簽來控制一行的顏色,所以解決方案的第一部分是定義一個標簽來高亮一行:

tree.tag_configure('highlight', background='lightblue')

接下來,編寫一個方法,從樹中的所有項目中刪除該標簽,然后將其添加到 cursor 下的項目中。 底層 tk 小部件具有添加和刪除標簽的方法,但這些方法沒有公開,因此我們需要直接調用底層 tk 代碼。

def highlight_row(event):
    tree = event.widget
    item = tree.identify_row(event.y)
    tree.tk.call(tree, "tag", "remove", "highlight")
    tree.tk.call(tree, "tag", "add", "highlight", item)

最后,將 function 綁定到<Motion>事件:

tree.bind("<Motion>", highlight_row)

這是一個完整的工作示例:

import tkinter as tk
from tkinter import ttk


def highlight_row(event):
    tree = event.widget
    item = tree.identify_row(event.y)
    tree.tk.call(tree, "tag", "remove", "highlight")
    tree.tk.call(tree, "tag", "add", "highlight", item)

root = tk.Tk()

tree = ttk.Treeview(root, style = 'W.TButton')
vsb = ttk.Scrollbar(root, command=tree.yview)
tree.configure(yscrollcommand=vsb.set)

vsb.pack(side="right", fill="y")
tree.pack(side="left", fill="both", expand=True)

tree.tag_configure('highlight', background='lightblue')
tree.bind("<Motion>", highlight_row)


for i in range(100):
    tree.insert("", "end", text=f"Item #{i+1}")
    tree.tag_bind(i, '<Motion>', highlight_row)

root.mainloop()

截屏

這是一個例子。 您可以進一步改進此代碼。

import tkinter as tk
from tkinter import ttk


def Enter_event(event):

    for x in tree.get_children():
        tree.tag_configure(tree.item(x)['tags'], background='')

    tree.tag_configure(tree.item(tree.identify_row(event.y))['tags'], background='yellow')

root = tk.Tk()
style = ttk.Style() 
  
  
style.configure('W.TButton') 

tree = ttk.Treeview(root, style = 'W.TButton')

tree.pack()
for i in range(10):
    tree.insert("", "end", text="Item %s" % i, tags=i)
    tree.tag_bind(i, '<Motion>', Enter_event)
        
root.mainloop()

解釋:

使用為每個單元格設置一個標簽,然后將每個標簽綁定到運動事件並調用事件處理程序。

  • tree.item(x)['tags']返回指定 iid 的標簽。

  • tree.get_children()返回所有孩子的 iid

  • tree.identify_row(event.y)返回 y position 處的行。

  • tree.tag_configure(tree.item(tree.identify_row(event.y))['tags'], background='yellow')將改變指定標簽的背景。

我嘗試了進入和離開事件,但它沒有被識別。 (此外,將注釋設置樣式配置為“Treeview”對我不起作用。如果對任何讀者有用,請通知我)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM