복붙노트

[PYTHON] ttk treeview : 대체 행 색상

PYTHON

ttk treeview : 대체 행 색상

대체 행에 다른 배경색을 갖도록 트리 뷰 위젯의 스타일을 설정할 수 있습니까? 예를 들어 행 1,3,5는 흰색 배경을, 행 2,4,6은 연한 파란색 - 회색 배경을가집니다.

눈금 선을 설정하고 싶습니다.

해결법

  1. ==============================

    1.나는 몇 달 전에이 같은 문제를 안고있었습니다.

    나는 몇 달 전에이 같은 문제를 안고있었습니다.

    tk docs에서 :

    You can assign a list of tags to each item using the "tags" 
    item configuration option (again, when creating the item or later on).
    
    Tag configuration options can then be specified, which will then 
    apply to all items having that tag.
    

    기본적으로 모든 홀수 번호 행에 하나의 태그를 적용하고 짝수 번호 행에 다른 태그를 적용한 다음 태그를 구성합니다.

    트리 뷰 안에 항목을 만들 때 태그를 추가하십시오.

    tree.insert('', 'end', text = 'your text', tags = ('oddrow',))
    

    이 코드는 tree에 요소를 만들고 tags 인수는 'oddrow'태그를 요소에 할당합니다.

    'oddrow'및 'evenrow'태그로 모든 요소를 ​​만든 후에는 태그에 색상을 지정할 수 있습니다.

    tree.tag_configure('oddrow', background='orange')
    tree.tag_configure('evenrow', background='purple')
    
  2. ==============================

    2.이것은 오래된 질문이지만, 트리를 만든 직후 (즉 항목이 아직 추가되지 않은 경우) 태그를 구성하는 레코드에 대해서도 작동합니다. 항목이 나중에 삽입되면 'oddrow'또는 'evenrow'태그에 적절한 배경색이 부여됩니다.

    이것은 오래된 질문이지만, 트리를 만든 직후 (즉 항목이 아직 추가되지 않은 경우) 태그를 구성하는 레코드에 대해서도 작동합니다. 항목이 나중에 삽입되면 'oddrow'또는 'evenrow'태그에 적절한 배경색이 부여됩니다.

  3. ==============================

    3.이것은 SQL 데이터베이스를 만드는 것입니다. 그런 다음 db에서 listbox로 몇 고객을로드합니다. 그런 다음 새로운 색상 테스트 버튼을 클릭하여 홀수 행에 대한 색상을 변경하여 표시 할 수 있습니다. 이것은 sqlalchemy가 모듈로 설치되어있는 한 실행 가능합니다.

    이것은 SQL 데이터베이스를 만드는 것입니다. 그런 다음 db에서 listbox로 몇 고객을로드합니다. 그런 다음 새로운 색상 테스트 버튼을 클릭하여 홀수 행에 대한 색상을 변경하여 표시 할 수 있습니다. 이것은 sqlalchemy가 모듈로 설치되어있는 한 실행 가능합니다.

    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()
    
  4. ==============================

    4.이 모듈은 별도의 모듈 없이도 실행 가능합니다 ... 코드를 혼란에 빠뜨릴 수 있습니다.

    이 모듈은 별도의 모듈 없이도 실행 가능합니다 ... 코드를 혼란에 빠뜨릴 수 있습니다.

    from Tkinter import *
    import ttk
    
    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):
            load = Button(self, text='show customers', command=lambda:self.load_working_customers())
            test = Button(self, text='test new colors', command=lambda:self.test_colors())
            load.pack()
            test.pack()
    
        def load_working_customers(self):
            new_customer_lb.delete(*new_customer_lb.get_children())
            for a in range(0,10):            
                new_customer_lb.insert('','end', values=(a,'first','last'))
    
        def test_colors(self):
            new_customer_lb.delete(*new_customer_lb.get_children())                 
    
            new_customer_lb.tag_configure("evenrow",background='white',foreground='black')
            new_customer_lb.tag_configure("oddrow",background='black',foreground='white')
            for a in range(0,10):            
                if a % 2 == 0:
                    new_customer_lb.insert('','end', values=(a,'first','last'), tags=('evenrow',))
                if a % 2 != 0:
                    new_customer_lb.insert('','end', values=(a,'first','last'), tags=('oddrow',))
    
    root = Tk()
    app = Test()
    app.mainloop()
    
  5. from https://stackoverflow.com/questions/7878730/ttk-treeview-alternate-row-colors by cc-by-sa and MIT license