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,
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()