如何在Tkinter Treeview中更改选定单元格的前景色或背景色?

我想更改tkinter.treeview中选定单元格的前景色或背景色。我怎样才能做到这一点?

此链接显示了更改树视图中所有单元格颜色的命令,但我无法在单个单元格中使用它。

ttk.Style().configure("Treeview", background="#383838", 

foreground="white", fieldbackground="red")

我以前写过一个测试代码。请使用此代码得出您的解决方案/建议。谢谢。

该链接显示了如何使用标记来更改数据行(即所选项目)而不是单元格的颜色。

回答:

  1. @BryanOkley分享到,不能更改ttk.Treeview中单个单元格的颜色。
  2. 因此,我探索了使用tk.Canvas()和tk.Canvas.create_text()来创建一种在ttk.Treeview()小部件中更改选定单元格颜色的错觉。我很幸运地来到 j08lue / ttkcalendar.py,它具有相同的目标,因此我从中适应了这一目标。
  3. 我的改编脚本(带有相关注释)如下所示。我希望它可以帮助其他人考虑这样做。

我还没有弄清楚为什么我的算法无法在“图标/树”列和“值”列中所选Treeview单元中的值上准确覆盖“画布文本框”。为此,我求助于使用通过反复试验确定的软糖值。但是,这不是理想的。

import tkinter as tk

import tkinter.ttk as ttk

import tkinter.font as tkFont

class App(tk.Frame):

def __init__(self, parent, *args, **kwargs):

ttk.Frame.__init__(self, parent, *args, **kwargs)

#1. Create Treeview with binding

self.tree = ttk.Treeview(parent, columns=("size", "modified"))

self.tree["columns"] = ("date", "time", "loc")

self.tree.column("#0", width=100, anchor='center')

self.tree.column("date", width=100, anchor='center')

self.tree.column("time", width=100, anchor='center')

self.tree.column("loc", width=100, anchor='center')

self.tree.heading("#0", text="Name")

self.tree.heading("date", text="Date")

self.tree.heading("time", text="Time")

self.tree.heading("loc", text="Location")

self.tree.insert("","end", text = "Grace",

values = ("2010-09-23","03:44:53","Garden"))

self.tree.insert("","end", text = "John" ,

values = ("2017-02-05","11:30:23","Airport"))

self.tree.insert("","end", text = "Betty",

values = ("2014-06-25","18:00:00",""))

self.tree.grid()

self.tree.bind('<ButtonRelease-1>', self.selectItem)

#2. Create a Canvas Overlay to show selected Treeview cell

sel_bg = '#ecffc4'

sel_fg = '#05640e'

self.setup_selection(sel_bg, sel_fg)

def setup_selection(self, sel_bg, sel_fg):

self._font = tkFont.Font()

self._canvas = tk.Canvas(self.tree,

background=sel_bg,

borderwidth=0,

highlightthickness=0)

self._canvas.text = self._canvas.create_text(0, 0,

fill=sel_fg,

anchor='w')

def selectItem(self, event):

# Remove Canvas overlay from GUI

self._canvas.place_forget()

# Local Parameters

x, y, widget = event.x, event.y, event.widget

item = widget.item(widget.focus())

itemText = item['text']

itemValues = item['values']

iid = widget.identify_row(y)

column = event.widget.identify_column(x)

print ('\n&&&&&&&& def selectItem(self, event):')

print ('item = ', item)

print ('itemText = ', itemText)

print('itemValues = ',itemValues)

print ('iid = ', iid)

print ('column = ', column)

#Leave method if mouse pointer clicks on Treeview area without data

if not column or not iid:

return

#Leave method if selected item's value is empty

if not len(itemValues):

return

#Get value of selected Treeview cell

if column == '#0':

self.cell_value = itemText

else:

self.cell_value = itemValues[int(column[1]) - 1]

print('column[1] = ',column[1])

print('self.cell_value = ',self.cell_value)

#Leave method if selected Treeview cell is empty

if not self.cell_value: # date is empty

return

#Get the bounding box of selected cell, a tuple (x, y, w, h), where

# x, y are coordinates of the upper left corner of that cell relative

# to the widget, and

# w, h are width and height of the cell in pixels.

# If the item is not visible, the method returns an empty string.

bbox = widget.bbox(iid, column)

print('bbox = ', bbox)

if not bbox: # item is not visible

return

# Update and show selection in Canvas Overlay

self.show_selection(widget, bbox, column)

print('Selected Cell Value = ', self.cell_value)

def show_selection(self, parent, bbox, column):

"""Configure canvas and canvas-textbox for a new selection."""

print('@@@@ def show_selection(self, parent, bbox, column):')

x, y, width, height = bbox

fudgeTreeColumnx = 19 #Determined by trial & error

fudgeColumnx = 15 #Determined by trial & error

# Number of pixels of cell value in horizontal direction

textw = self._font.measure(self.cell_value)

print('textw = ',textw)

# Make Canvas size to fit selected cell

self._canvas.configure(width=width, height=height)

# Position canvas-textbox in Canvas

print('self._canvas.coords(self._canvas.text) = ',

self._canvas.coords(self._canvas.text))

if column == '#0':

self._canvas.coords(self._canvas.text,

fudgeTreeColumnx,

height/2)

else:

self._canvas.coords(self._canvas.text,

(width-(textw-fudgeColumnx))/2.0,

height/2)

# Update value of canvas-textbox with the value of the selected cell.

self._canvas.itemconfigure(self._canvas.text, text=self.cell_value)

# Overlay Canvas over Treeview cell

self._canvas.place(in_=parent, x=x, y=y)

if __name__ == "__main__":

window = tk.Tk()

app = App(window)

window.mainloop()

以上是 如何在Tkinter Treeview中更改选定单元格的前景色或背景色? 的全部内容, 来源链接: utcz.com/qa/422848.html

回到顶部