TTK Treeview:选中颜色

9
我的ttk树视图中选择的行显示为深蓝色背景,文本为白色。
如果我使用标签设置行的颜色,例如:
self.tree.item(item, tags=('oddrow'))

并将标签配置为颜色,例如:

self.tree.tag_configure('oddrow', background='lightgrey')

当选择奇数行时,背景颜色不会改变(保持为浅灰色),而文本颜色会从黑色变为白色。无论该行是否被标记颜色,如何使所选行的背景变为深蓝色? 没有标记颜色的行显示为黑色底白字,或者当选择时为白色底深蓝字。
我尝试过:
ttk.Style().configure('Treeview', selectbackground='blue')

但是那并没有起到任何作用。

编辑:我想当我选择一个项目时,我可以重新标记它为非奇数行,然后在取消选择时返回,但这样做相当不优雅。


你尝试过使用 self.tree.tag_configure('oddrow', background='lightgrey', selectbackground='blue') 吗? - Steven Rumbalski
@StevenRumbalski:_tkinter:TclError:未知选项“-selectbackground” - foosion
只需阅读http://www.tcl.tk/man/tcl/TkCmd/ttk_treeview.htm#M69上的文档。标签仅支持前景、背景、字体和图像。对于错误的建议,我们深感抱歉。 - Steven Rumbalski
2个回答

5

根据TkDocs教程中树形结构的介绍,您可以:

  • 创建一个带有所需颜色的标签(用于选择的行)

然后,捕获treeview的虚拟事件:

  • 在行得到焦点时将标签分配给该行
  • 在行失去焦点时从该行取消分配标签

这是我使用的文档中的具体段落:

The treeview will generate virtual events "<TreeviewSelect>", "<TreeviewOpen>" 
and "<TreeviewClose>" which allow you to monitor changes to the widget made 
by the user.   You can use the "selection" method to determine the current 
selection (the selection can also be changed from your program). 

随着教程中的一些代码:

tree.tag_configure('ttk', background='yellow')
tree.tag_bind('ttk', '<1>', itemClicked); # the item clicked can be found via tree.focus()

注意:我不确定这会起作用。我需要找出代码,看看我做了什么。


这基本上就是我最终所做的事情,正如我在我的编辑中所提到的那样有点神秘。当选择一行时(使用<TreeviewSelect>监视),我会重新标记所有行的颜色,使其交替显示(以清除任何先前的更改),然后用纯色背景标记当前行,以便默认选择的颜色可以正确显示。 - foosion
@foosion -- 我的意思是建议只对选定的行进行标记/取消标记。也就是说,保留所有“oddrow”标记的原样,并向选定的行添加第二个标记。我不确定的事情是,如果一行上有两个标记,哪一个会生效? - Matt Fenwick
我正在做的一些工作包括删除行、添加行、移动行,因此经常重新标记所有内容是有意义的。另一个选择是取消选定行的标记(这样可以使选定背景看起来正确;或者用选定颜色标记它),然后在选择更改时重新标记它。 - foosion

4
如果有人正在寻找更改tkinter treeview所选颜色的答案,您可以查看下面的代码。
您需要更改状态“selected”而不是“active”。
style = ttk.Style()
style.configure("Treeview",
                background="#E1E1E1",
                foreground="#000000",
                rowheight=25,
                fieldbackground="#E1E1E1")
style.map('Treeview', background=[('selected', '#BFBFBF')])

不相关于此处。 - Aryan Firouzian
@AryanFirouzian 这并不是无关紧要的,而是非常正确的答案style.map('Treeview', background=[('selected', '#dc8c34')])将会改变所选列的颜色,这正是问题所问的。 - Billy
谢谢,Durai。工作得非常顺利。 - Shlomo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接