tkinter Treeview:使用标记和配置的标记更改Treeview中的偶数行和奇数行颜色根本不起作用

2024-04-26 10:46:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直很难找到我的解决方案,其中tags和tag.configured无法改变我的oddrow和evenrow背景色,以便轻松查看库存列表中的行,即使我复制了示例代码,但仍然无法为我工作。为了进一步了解问题,以下是我们遇到问题的代码部分:

    for record in records:
        #print(sorted(str(record[0]), reverse=False))
        col_head.insert("", "end", text=record, values=(record[0], record[1], record[2], record[3], record[4], record[5]), tags=('ODDROW'))
        col_head.tag_configure('ODDROW', background='gray')

当执行时

Output Screenshot

清单中的Treeview甚至不会显示任何灰色背景或我试图在tag_配置中输入的其他颜色,如果您想查看整个程序,请看这里

from tkinter import *
from tkinter import ttk
from datetime import datetime
import sqlite3
import os


from tkinter import *
from tkinter import ttk
from datetime import datetime
import sqlite3
import os


def invent():

    def inventory_tab():

        invent_display = Tk()
        invent_display.geometry("1250x650")
        invent_display.configure(bg="gray")
        invent_display.title("Inventory Tab")

        #Name of the Retailer FRAME1
        title_box = Frame(invent_display, width=1000, height=100, pady=5, bd=10, background='light blue', relief="raise")
        title_box.grid(column=1, row=1)
        retailer_name = Label(title_box, text='retailer name', width=50, height=1, bd=2, font=("Calibri", 35), relief="sunken")
        retailer_name.grid(column=0,row=0, pady=5)

        #Date FRAME2
        dtformat = datetime.now()
        date_time_format = dtformat.strftime("%d/%m/%Y %H:%M:%S")
        date_and_time = Label(title_box, text=date_time_format, width=50, height=1, bd=2, font=("Calibri", 20), fg='green', relief="sunken")
        date_and_time.grid(column=0,row=1)

        # INVENTORY LIST FRAME3
        inventory_list = Frame(invent_display, width=500, height=500, bd=10, pady=10, relief="sunken")
        inventory_list.grid(column=1, row=2)

        # treeview Multiple Column
        col_head = ttk.Treeview(inventory_list,
                                column=("prod_id", "p_name", "p_brand", "initial_stock", "stock", "price" ),
                                show='headings')
        #scrollbar in the Column
        invent_scroll = Scrollbar(inventory_list, orient="vertical", command=col_head.yview)
        invent_scroll.grid(column=2,row=1, sticky=NS)
        col_head.configure(yscrollcommand=invent_scroll.set)

        #heading TItle
        col_head.heading("#1", text="Product ID")
        col_head.heading("#2", text="Product Name", anchor=W)#, command=inventory_sort)
        col_head.heading("#3", text="Product Brand")
        col_head.heading("#4", text="Initial Stock")
        col_head.heading("#5", text="Stock")
        col_head.heading("#6", text="Price")
        col_head.grid(column=1, row=1)

        # Input Values from Database
        # Create Database
        conn = sqlite3.connect('Inventory_table.db')

        # Create cursor
        c = conn.cursor()

        # print
        c.execute("SELECT prod_id, p_name, p_brand, initial_stock, stock, price FROM inventory")
        records = c.fetchall()

        for record in records:
            #print(sorted(str(record[0]), reverse=False))
            col_head.insert("", "end", text=record, values=(record[0], record[1], record[2], record[3], record[4], record[5]), tags=('ODDROW'))
            col_head.tag_configure('ODDROW', background='blue')



        # BUTTON ORGANIZE FRAME4
        button_organize = Frame(invent_display, width=1200, height=250, pady=5, bd=10, relief="raise")
        button_organize.grid(column=1, row=3)

        #Column1 add record FRAM4
        add_record_label = Label(button_organize, text='Add Record Tab', width=71, height=3, bg='pink')
        add_record_label.grid(column=1,row=0)
        add_rec_frame = Frame(button_organize, width=400, height=250, bd=2, pady=5, relief="raise")
        add_rec_frame.grid(column=1,row=1)

        #LABEL
        p_name_label = Label(add_rec_frame, text='Product Name:')
        p_name_label.grid(row=0, column=0, pady=(10, 0))
        p_brand_label = Label(add_rec_frame, text='Product Brand:')
        p_brand_label.grid(row=1, column=0)
        initial_stock_label = Label(add_rec_frame, text='Initial Stock: ')
        initial_stock_label.grid(row=2, column=0)
        stock_label = Label(add_rec_frame, text='Stock:')
        stock_label.grid(row=3, column=0)
        price_label = Label(add_rec_frame, text='Price:')
        price_label.grid(row=4, column=0)

        #ENTRY
        p_name = Entry(add_rec_frame, width=30)
        p_name.grid(row=0, column=1, padx=20, pady=(10, 0))
        p_brand = Entry(add_rec_frame, width=30)
        p_brand.grid(row=1, column=1, padx=20)
        initial_stock = Entry(add_rec_frame, width=30)
        initial_stock.grid(row=2, column=1, padx=20)
        stock = Entry(add_rec_frame, width=30)
        stock.grid(row=3, column=1, padx=20)
        price = Entry(add_rec_frame, width=30)
        price.grid(row=4, column=1, padx=20, pady=5)

        #BUTTON
        add_btn = Button(add_rec_frame, text="Add record")#, command=add_record)
        add_btn.grid(row=1, column=2, columnspan=2, padx=5, pady=5, ipadx=58)
        clear_btn = Button(add_rec_frame, text="Clear Entry")#, command=add_record)
        clear_btn.grid(row=3, column=2, columnspan=2, padx=5, pady=5, ipadx=58)



        #Column2 edit/search/delete recordsFRAM4
        #Column3 inventory setting FRAM4
        invent_display.mainloop()

    # Insert Variable Here only used for Inventory Tab

    table_checker = os.listdir()

    if 'Inventory_table.db' in table_checker:
        # Create Database
        conn = sqlite3.connect('Inventory_table.db')

        # Create cursor
        c = conn.cursor()

        inventory_tab()

    else:
        # Create Database
        conn = sqlite3.connect('Inventory_table.db')

        # Create cursor
        c = conn.cursor()
        c.execute("""CREATE TABLE inventory (
                prod_id integer,
                p_name text,
                p_brand text,
                initial_stock integer,
                stock integer,
                price integer
                )""")
        inventory_tab()
invent()

顺便说一下,我是python新手,最近学习了tkinter和一些东西。因此,我们非常感谢您的任何帮助和建议

顺便说一下,这段代码需要一个db,如果您要运行程序Inventory_table.db,文件就在这里

再次提前感谢您的帮助

另外,我使用Python3.8作为Pycharm的IDE的项目解释器

编辑:我在tkinter.tcl版本的基础上使用的tkinter版本是8.6版


Tags: textaddstockcolumncolrecordwidthframe