【问题标题】:tkinter ttk treeview colored rowstkinter ttk treeview 彩色行
【发布时间】:2020-08-05 22:53:54
【问题描述】:

我正在尝试使用标签和 tag_configure 为 tkinter 树视图对象中的行设置颜色。

之前有一个关于着色行的讨论,它相当古老,似乎不再适用于 Python3:

ttk treeview: alternate row colors

我添加了一个简短的示例。对我来说,所有行都保持白色,与我在插入命令之前还是之后执行 tag_configure 无关。

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
w = tk.Label(root, text="Hello, world!")
w.pack()

lb= ttk.Treeview(root, columns=['number', 'text'], show="headings", height =20)
lb.tag_configure('gr', background='green')
lb.column("number", anchor="center", width=10)    
lb.insert('',tk.END, values = ["1","testtext1"], tags=('gr',))
lb.insert('',tk.END, values = ["2","testtext2"])

lb.pack()

root.mainloop()

发生了什么变化或我缺少什么?

编辑: 似乎这是一个带有解决方法的新已知错误,但我没有得到这个工作: https://core.tcl-lang.org/tk/tktview?name=509cafafae

EDIT2: 我现在使用 tk 版本 8.6.10(构建 hfa6e2cd_0,通道 conda-forge)和 python 3.7.3。谁能用这个版本的python和tk重现这个错误?

【问题讨论】:

  • 我已经执行了你的代码——它可以工作。你的 Tkinter 版本是什么? (要检查它,请在交互模式下输入 from tkinter import TkVersion; TkVersion,但不要在实际代码中使用 ;)
  • Tkinter 版本是 8.6,python 版本是 3.7.3
  • no longer for Python3 -- 这是一个绝对错误的句子,因为 Tk 版本独立于 Python 版本(当然有默认安装的 Tk 版本)
  • 对了,你有没有试过设置Treeview的样式?我的意思是,`lb = ttk.Treeview(root, ...., style="Treeview")
  • @DemianWolf 我已尝试实现该解决方法的代码,但没有使此样式命令正常工作。如果我只是将 style=Treeview" 添加到 ttk.Treeview 命令,它不起作用。

标签: python tkinter treeview ttk


【解决方案1】:

您不再需要使用 fixed_map 该错误已在 tkinter 版本 8.6 中修复。 以下代码适用于我在 Linux 中运行的 tkinter 8.6 和 python 3.8.2。

import tkinter as tk
import tkinter.ttk as ttk

def fixed_map(option):
    return [elm for elm in style.map("Treeview", query_opt=option) if elm[:2] != ("!disabled", "!selected")]

root = tk.Tk()
style = ttk.Style()
style.map("Treeview", foreground=fixed_map("foreground"), background=fixed_map("background"))

w = tk.Label(root, text="Hello, world!")
w.pack()

lb= ttk.Treeview(root, columns=['number', 'text'], show="headings", height =20)
lb.tag_configure('odd', background='green')
lb.tag_configure('even', background='lightgreen')

lb.column("number", anchor="center", width=10)
lb.insert('', tk.END, values = ["1","testtext1"], tags=('odd',))
lb.insert('', tk.END, values = ["2","testtext2"], tags=('even',))
lb.insert('', tk.END, values = ["3","testtext3"], tags=('odd',))
lb.insert('', tk.END, values = ["4","testtext4"], tags=('even',))

lb.pack()

root.mainloop()

【讨论】:

  • 在 windows 中,tkinter 8.6.8。和 python 3.8.2 不起作用。哪个颠覆了 tkinter 3.8。你在用吗(你会看到conda list tk
  • 我没有使用 Anaconda。上面的代码在 Linux 中工作,我在 Windows 10 上尝试过,你仍然需要使用 fixed_map 函数才能使其工作。我编辑了代码以显示这一点。
  • 你也可以看看这篇文章也许会有所帮助,看看文章末尾的工作示例,它已经在 Windows 和 Linux 中进行了测试。 stackoverflow.com/questions/61350804/…
  • 我决定只自动授予这个答案,因为它只是我的答案的副本,所以我不确定它是否值得全部赏金。不幸的是,Chuck666 没有来领取他的赏金。感谢您的帮助!
【解决方案2】:

Chuck666 的回答成功了: https://stackoverflow.com/a/60949800/4352930

此代码有效

import tkinter as tk
import tkinter.ttk as ttk

def fixed_map(option):
    # Returns the style map for 'option' with any styles starting with
    # ("!disabled", "!selected", ...) filtered out

    # style.map() returns an empty list for missing options, so this should
    # be future-safe
    return [elm for elm in style.map("Treeview", query_opt=option)
            if elm[:2] != ("!disabled", "!selected")]



root = tk.Tk()

style = ttk.Style()
style.map("Treeview", 
          foreground=fixed_map("foreground"),
          background=fixed_map("background"))

w = tk.Label(root, text="Hello, world!")
w.pack()

lb= ttk.Treeview(root, columns=['number', 'text'], show="headings", height =20)
lb.tag_configure('gr', background='green')
lb.column("number", anchor="center", width=10)    
lb.insert('',tk.END, values = ["1","testtext1"], tags=('gr',))
lb.insert('',tk.END, values = ["2","testtext2"])

lb.pack()

root.mainloop()

我希望 Chuck666 在这里复制他的答案,因为我认为如果他出现,他已经获得了奖金。

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 2012-10-17
    • 2014-07-08
    • 2019-06-25
    相关资源
    最近更新 更多