![](/img/trans.png)
[英]How can i change the color background to row in treeview ( python tkinter)
[英]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.