ttk treeview: alternate row colors

前端 未结 4 1192
野性不改
野性不改 2020-12-01 13:09

How can I set a style for treeview widgets so that alternate rows have different background colors, for example, rows 1,3,5 have white backgrounds and rows 2,4,

4条回答
  •  悲&欢浪女
    2020-12-01 13:49

    This is to create a SQL db. then loads the few customers from db into listbox. then you can click test new colors button to show it changing colors for odd rows. this is runnable as long as you have sqlalchemy installed as module.

    from Tkinter import *
    import ttk
    from sqlalchemy import Column, ForeignKey, Integer, String, Text
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import relationship
    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    
    base = declarative_base()
    
    
    class Customer(base):
        __tablename__='Customer_Details'
        Id = Column(Integer, primary_key=True)
        first_name = Column(String(64))
        last_name = Column(String(64))
    
    
    class DB_connection(object):
        def __enter__(variable):
            variable.engine = create_engine("sqlite:///example.db")
            base.metadata.bind = variable.engine
            variable.DBSession = sessionmaker(bind=variable.engine)
            variable.Session = variable.DBSession
            variable.session = variable.Session()
            return variable
        def __exit__(variable, exc_type, exc_val, exc_tb):
            variable.session.commit()
            variable.session.close()
    
    class Test(Frame):
    
        def __init__(self):
            Frame.__init__(self)
            self.pack()
            self.listbox()
            self.buttons()
    
        def listbox(self):
            global new_customer_lb
    
            scrollbar = Scrollbar(self, orient="vertical")
            new_customer_lb = ttk.Treeview(self, columns=('ID','First Name','Last Name'))
            new_customer_lb['show']='headings'
            new_customer_lb.heading('#1', text= 'ID')
            new_customer_lb.column('#1', width=50, stretch=NO)
            new_customer_lb.heading('#2', text= 'First Name')
            new_customer_lb.column('#2', width=100, stretch=NO)
            new_customer_lb.heading('#3', text= 'Last Name')
            new_customer_lb.column('#3', width=100, stretch=NO)
            new_customer_lb.configure(yscroll = scrollbar.set, selectmode="browse")
            scrollbar.config(command=new_customer_lb.yview)
            new_customer_lb.pack()
    
    
        def buttons(self):
            db = Button(self, text='make DB', command=lambda:self.create_db())
            customer = Button(self, text='create customers', command=lambda:self.create_customers())
            load = Button(self, text='show customers', command=lambda:self.load_working_customers())
            test = Button(self, text='test new colors', command=lambda:self.test_colors())
            db.pack()
            customer.pack()
            load.pack()
            test.pack()
    
        def create_db(self):
            print("start create db function")
            engine = create_engine('sqlite:///example.db')
            base.metadata.create_all(engine)
            print("Success create db function")
    
        def create_customers(self):
            print ('Start add customer sql')
            customer1 = Customer(first_name='first1',last_name='last1')
            customer2 = Customer(first_name='first2',last_name='last2')
            customer3 = Customer(first_name='first3',last_name='last3')
            customer4 = Customer(first_name='first4',last_name='last4')
            with DB_connection() as DB:
                DB.session.add_all([customer1,customer2,customer3,customer4])
            print ('sucess add customer sql')
    
        def load_working_customers(self):
            new_customer_lb.delete(*new_customer_lb.get_children())    
            with DB_connection() as DB:
                for a,b,c in DB.session.query(Customer.Id,Customer.first_name,Customer.last_name).order_by(Customer.Id):
                    new_customer_lb.insert('','end', values=(a,b,c))
    
        def test_colors(self):
            new_customer_lb.delete(*new_customer_lb.get_children())                 
    
    ### configure even and odd here
            new_customer_lb.tag_configure("evenrow",background='white',foreground='black')
            new_customer_lb.tag_configure("oddrow",background='black',foreground='white')
    
            with DB_connection() as DB:
    ## this loop will take 'a' (Customer.Id) and test if even or odd
                for a,b,c in DB.session.query(Customer.Id,Customer.first_name,Customer.last_name).order_by(Customer.Id):                
                    if a % 2 == 0:
                        new_customer_lb.insert('','end', values=(a,b,c), tags=('evenrow',))
                    else:
                        new_customer_lb.insert('','end', values=(a,b,c), tags=('oddrow',))
    
    root = Tk()
    app = Test()
    app.mainloop()
    

提交回复
热议问题