es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tkinter Treeview: cambio de color de fondo en cada

Estoy intentando establecer el fondo de un widget Treeview basado en las respuestas proporcionadas aquí.

El problema con esta respuesta es que solo cubre estilos globales. En mi código estoy usando 2-3 Treeviews, cada uno necesita su propio estilo.

En el código proporcionado, quiero establecer el fondo del primer Treeview en blanco y el segundo Treeview en negro.

MCVE:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

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

def set_theme(tv, bg, fg):
    style = ttk.Style()
    style.theme_use("clam")
    style.map("Treeview", foreground=fixed_map("foreground", style), background=fixed_map("background", style))
    style.configure("Treeview", background=bg, fieldbackground=bg, foreground=fg)

tree1 = ttk.Treeview(root)
tree1.pack(side="left", fill="both", expand=True)
for i in range(10):
    tree1.insert("", "end", text=f"t1 Item #{i+1}")
set_theme(tree1, "white", "black")

tree2 = ttk.Treeview(root)
tree2.pack(side="left", fill="both", expand=True)
for i in range(10):
    tree2.insert("", "end", text=f"t2 Item #{i+1}")
set_theme(tree2, "black", "white")

root.mainloop()
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El código proporcionado establece el fondo de todas las vistas de árbol en el mismo color, pero si quieres establecer el fondo de cada vista de árbol individualmente, puedes modificar la función set_theme. En lugar de llamar a style.configure("Treeview", background=bg, fieldbackground=bg, foreground=fg), puedes llamar a style.configure(tv, background=bg, fieldbackground=bg, foreground=fg), donde tv es el widget de vista de árbol específico que deseas modificar. Luego, al llamar a set_theme, puedes pasar el widget de vista de árbol como primer argumento en lugar de usar tree1 o tree2. Aquí tienes el código modificado:

    import tkinter as tk
    from tkinter import ttk
    
    root = tk.Tk()
    
    def _fixed_map(option, style):
            return [elm for elm in style.map("Treeview", query_opt=option) if elm[:2] != ("!disabled", "!selected")]
    
    def set_theme(tv, bg, fg):
        style = ttk.Style()
        style.theme_use("clam")
        style.map("Treeview", foreground=_fixed_map("foreground", style), background=_fixed_map("background", style))
        style.configure(tv, background=bg, fieldbackground=bg, foreground=fg)
    
    
    tree1 = ttk.Treeview(root)
    tree1.pack(side="left", fill="both", expand=True)
    for i in range(10):
        tree1.insert("", "end", text=f"t1 Elemento #{i+1}")
    set_theme(tree1, "white", "black")
    
    tree2 = ttk.Treeview(root)
    tree2.pack(side="left", fill="both", expand=True)
    for i in range(10):
        tree2.insert("", "end", text=f"t2 Elemento #{i+1}")
    set_theme(tree2, "black", "white")
    
    root.mainloop()
    

    Ahora, set_theme(tree1, "white", "black") establece el fondo de la primera vista de árbol en blanco y el color del texto en negro, mientras que set_theme(tree2, "black", "white") establece el fondo de la segunda vista de árbol en negro y el color del texto en blanco.

Comments are closed.