Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[Tkinter][Python3.6] Cambiar color celda TreeView
#1
Hola buenas, se puede cambiar el color de fondo de una celda en concreto de un treeview según la información que contenga ?? En plan que si contiene un 0 el fondo sea verde, si contiene un 1 el fondo sea naranja y si contiene un 2 el fondo sea rojo
Responder
#2
Hola, acá tenés un código de ejemplo sobre cómo aplicar estilos sobre una celda: https://riptutorial.com/tkinter/example/...a-treeview.

En tu caso deberías, además, atender al evento disparado cuando el contenido de una celda cambia, para poder también actualizar el estilo.

Saludos
Responder
#3
(12-11-2018, 11:45 PM)Francisco escribió: Hola, acá tenés un código de ejemplo sobre cómo aplicar estilos sobre una celda: https://riptutorial.com/tkinter/example/...a-treeview.

En tu caso deberías, además, atender al evento disparado cuando el contenido de una celda cambia, para poder también actualizar el estilo.

Saludos


Buenas siento reabrir este tema pero me ocurre algo curioso:



Con este código:

  1. from tkinter import *
  2.  
  3. import tkinter as tk
  4.  
  5. from tkinter import ttk
  6.  
  7. from datetime import *
  8.  
  9. import time
  10.  
  11. import calendar
  12.  
  13.  
  14.  
  15. class Treeviewr:
  16.  
  17.  
  18.     def __init__(self):
  19.  
  20.  
  21.         # MAIN WINDOW
  22.  
  23.  
  24.  
  25.         self.root = Tk()
  26.  
  27.         self.root.title("PRUEBAS")
  28.  
  29.         self.root.geometry()
  30.  
  31.  
  32.  
  33.     # PANEL 1
  34.  
  35.  
  36.  
  37.         self.caj1 = ttk.Frame(self.root)
  38.  
  39.         self.caj1.grid(row=0, column=0)
  40.  
  41.  
  42.  
  43.     # PANEL 2
  44.  
  45.  
  46.  
  47.         self.caj2 = ttk.Frame(self.root)
  48.  
  49.         self.caj2.grid(row=1, column=1)
  50.  
  51.  
  52.  
  53.     #STYLES TREEVIEW
  54.  
  55.  
  56.  
  57.         self.styletree= ttk.Style()
  58.  
  59.         self.styletree.configure('T.Treeview')
  60.  
  61.  
  62.  
  63.     # TREEVIEW
  64.  
  65.  
  66.  
  67.         self.info = ttk.Treeview(self.caj1, style='T.Treeview', columns=('col1', 'col2', 'col3', 'col4'))
  68.  
  69.         self.info.grid(row=0, column=0, ipadx=200)
  70.  
  71.  
  72.  
  73.         self.info.insert("", tk.END, text='Prueba0', values=('18', 'Juan'), tags=('prob',))
  74.  
  75.         self.info.insert("", tk.END, text='Prueba1', values=('20', 'Adrián'), tags=('prob',))
  76.  
  77.         self.info.insert("", tk.END, text='Prueba2', values=('23', 'Felipe', '3'), tags=('prob',))
  78.  
  79.  
  80.  
  81.         self.info.tag_configure('prob', background='black', foreground='red')
  82.  
  83.  
  84.  
  85.  
  86.  
  87.         self.info.heading("#0", text='COLUMNA1')
  88.  
  89.         self.info.heading('col1', text='COLUMNA2')
  90.  
  91.         self.info.heading('col2', text='COLUMNA3')
  92.  
  93.         self.info.heading('col3', text='COLUMNA4')
  94.  
  95.         self.info.heading('col4', text='COLUMNA5')
  96.  
  97.         self.info.column("#0", minwidth=0, width=5)
  98.  
  99.         self.info.column('col1', minwidth=25, stretch=0, anchor='center')
  100.  
  101.         self.info.column('col2', minwidth=25, stretch=0, anchor='center')
  102.  
  103.         self.info.column('col3', minwidth=25, stretch=0, anchor='center')
  104.  
  105.         self.info.column('col4', minwidth=25, stretch=0, anchor='center')
  106.  
  107.  
  108.  
  109.         self.root.mainloop()
  110.  
  111.  
  112.  
  113. def main():
  114.  
  115. my_app = Treeviewr()
  116.  
  117.  
  118.  
  119.  
  120.  
  121. if __name__ == '__main__':
  122.  
  123. main()


A mí no me aparece el estilo de las celdas ¿Por qué?. Lo he metido tal cual en otro ordenador con Ubuntu (En el pc de sobremesa tengo Debian 10) y funciona perfectamente. Puede haber algo mal configurado o instalado de python3? o el código es incorrecto?.

Muchas gracias.
Responder
#4
El código parece correcto. Puede que tengas una versión antigua de Tk en tu Debian que no soporte estilos.

Saludos!
Responder
#5
(14-12-2019, 07:26 PM)Francisco escribió: El código parece correcto. Puede que tengas una versión antigua de Tk en tu Debian que no soporte estilos.

Saludos!
Muchas gracias Francisco. Pues nada. Va siendo hora de hacer una nueva instalación limpia de Debian.
Responder
#6
(17-12-2019, 03:28 PM)Myszowor escribió:
(14-12-2019, 07:26 PM)Francisco escribió: El código parece correcto. Puede que tengas una versión antigua de Tk en tu Debian que no soporte estilos.

Saludos!
Muchas gracias Francisco. Pues nada. Va siendo hora de hacer una nueva instalación limpia de Debian.
Siento tardar en reabrir el tema, pero me ha costado encontrar la solución.
Al parecer es un problema de actualizar tk a la version 8.6.9.

Os remito a esta web https://bugs.python.org/issue36468 donde indican como solucionarlo. Al menos provisionalmente ya que espero que Tk los solucionen en un futuro. Mientras tanto si alguien tiene el mismo problema os dejo la solución aquí.

Así queda el código y funciona correctamente:

  1. from tkinter import *
  2.  
  3. import tkinter as tk
  4.  
  5. from tkinter import ttk
  6.  
  7. from datetime import *
  8.  
  9. import time
  10.  
  11. import calendar
  12.  
  13.  
  14.  
  15. class Treeviewr:
  16.  
  17.  
  18.     def __init__(self):
  19.  
  20.  
  21.         # MAIN WINDOW
  22.  
  23.  
  24.  
  25.         self.root = Tk()
  26.  
  27.         self.root.title("PRUEBAS")
  28.  
  29.         self.root.geometry()
  30.  
  31.  
  32.  
  33.     # PANEL 1
  34.  
  35.  
  36.  
  37.         self.caj1 = ttk.Frame(self.root)
  38.  
  39.         self.caj1.grid(row=0, column=0)
  40.  
  41.  
  42.  
  43.     # PANEL 2
  44.  
  45.  
  46.  
  47.         self.caj2 = ttk.Frame(self.root)
  48.  
  49.         self.caj2.grid(row=1, column=1)
  50.  
  51.  
  52.  
  53.     #STYLES TREEVIEW
  54.  
  55.  
  56.  
  57.         self.styletree= ttk.Style()
  58.  
  59.         self.styletree.configure('T.Treeview')
  60.  
  61.         def fixed_map(option): # Esto justo antes del Treeview y funciona todo perfectamente.
  62.              return [elm for elm in style.map('Treeview', query_opt=option) if elm[:2] != ('!disabled', '!selected')]
  63.  
  64.         style = ttk.Style()
  65.         style.map('Treeview', foreground=fixed_map('foreground'), background=fixed_map('background'))
  66.  
  67.     # TREEVIEW
  68.  
  69.  
  70.  
  71.         self.info = ttk.Treeview(self.caj1, style='T.Treeview', columns=('col1', 'col2', 'col3', 'col4'))
  72.  
  73.         self.info.grid(row=0, column=0, ipadx=200)
  74.  
  75.  
  76.  
  77.         self.info.insert("", tk.END, text='Prueba0', values=('18', 'Juan'), tags=('prob',))
  78.  
  79.         self.info.insert("", tk.END, text='Prueba1', values=('20', 'Adrián'), tags=('prob',))
  80.  
  81.         self.info.insert("", tk.END, text='Prueba2', values=('23', 'Felipe', '3'), tags=('prob',))
  82.  
  83.  
  84.  
  85.         self.info.tag_configure('prob', background='black', foreground='red')
  86.  
  87.  
  88.  
  89.  
  90.  
  91.         self.info.heading("#0", text='COLUMNA1')
  92.  
  93.         self.info.heading('col1', text='COLUMNA2')
  94.  
  95.         self.info.heading('col2', text='COLUMNA3')
  96.  
  97.         self.info.heading('col3', text='COLUMNA4')
  98.  
  99.         self.info.heading('col4', text='COLUMNA5')
  100.  
  101.         self.info.column("#0", minwidth=0, width=5)
  102.  
  103.         self.info.column('col1', minwidth=25, stretch=0, anchor='center')
  104.  
  105.         self.info.column('col2', minwidth=25, stretch=0, anchor='center')
  106.  
  107.         self.info.column('col3', minwidth=25, stretch=0, anchor='center')
  108.  
  109.         self.info.column('col4', minwidth=25, stretch=0, anchor='center')
  110.  
  111.  
  112.  
  113.         self.root.mainloop()
  114.  
  115.  
  116.  
  117. def main():
  118.  
  119. my_app = Treeviewr()
  120.  
  121.  
  122.  
  123.  
  124.  
  125. if __name__ == '__main__':
  126.  
  127. main()
Responder
#7
Gracias por el aporte!

Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)