Format individual cell/item rather than entire row in tkinter ttk treeview Format individual cell/item rather than entire row in tkinter ttk treeview tkinter tkinter

Format individual cell/item rather than entire row in tkinter ttk treeview


It's not possible to set the style of individual cells in Treeview; only entire rows can use the tag attribute.

If you just want a table of values then I'd recommend just using ttk.Label widgets, which you can format in a huge number of ways. For example:

import Tkinter as tkimport ttkimport pandas as pdfrom random import randrangePADDING = dict(padx=3, pady=3)class GridView(tk.Frame):    def __init__(self, master=None, **kwargs):        tk.Frame.__init__(self, master, **kwargs)        self.labels = []        style = ttk.Style()        style.configure("red.TLabel", background='red')        style.configure("green.TLabel", background='green')        style.configure("header.TLabel", font = '-weight bold')    def set(self, df):        self.clear()        for col, name in enumerate(df.columns):            lbl = ttk.Label(self, text=name, style='header.TLabel')            lbl.grid(row=0, column=col, **PADDING)            self.labels.append(lbl)        for row, values in enumerate(df.itertuples(), 1):            for col, value in enumerate(values[1:]):                lbl = ttk.Label(self, text=value, style=self.get_style(value))                lbl.grid(row=row, column=col, **PADDING)                self.labels.append(lbl)    @staticmethod    def get_style(value):        if value > 70:            return "red.TLabel"        elif value < 30:            return "green.TLabel"        else:            return None    def clear(self):        for lbl in self.labels:            lbl.grid_forget()        self.labels = []class GUI(tk.Frame):    def __init__(self, master=None, **kwargs):        tk.Frame.__init__(self, master, **kwargs)        self.table = GridView(self)        self.table.pack()        btn = ttk.Button(self, text="populate", command=self.populate)        btn.pack()        btn = ttk.Button(self, text="clear", command=self.table.clear)        btn.pack()    def populate(self):        self.table.set(new_rand_df())def main():    root = tk.Tk()    win = GUI(root)    win.pack()    root.mainloop()def new_rand_df():    width = 5    height = 5    return pd.DataFrame([[randrange(100) for _ in range(width)] for _ in range(height)], columns = list('abcdefghijklmnopqrstuvwxyz'[:width]))if __name__ == '__main__':    main()


this is possible using a custom cellrenderer in Gtk3, e.g.:

import gigi.require_version( 'Gtk', '3.0' )from gi.repository import Gtk, GObjectclass My_CellRendererText( Gtk.CellRendererText ):    def __init__( self ):        super().__init__()    def do_render( self, cr, widget, background_area, cell_area, flags ):        cell_text = self.props.text        self.props.underline = ( "X" in cell_text )        self.props.weight = 700 if ( cell_text.isdigit() and int( cell_text ) > 3 ) else 400        return Gtk.CellRendererText.do_render( self, cr, widget, background_area, cell_area, flags )GObject.type_register( My_CellRendererText )