繁体   English   中英

无法在 Tkinter Python 中向 Treeview 添加项目

[英]Cannot Add Items To Treeview In Tkinter Python

我正在开发一个 GUI。 我在其中使用 OOP 使其工作。 我创建了一个名为 add_part() 的 function,它将零件详细信息添加到 treeview。 treeview 正在另一个 class 中创建。

class PartsDetials(tk.LabelFrame):
    def __init__(self, parent, bg="#ff704d", fg="black", bd=6, relief=GROOVE, font="Poppins 20 bold", *args, **kwargs):
       super().__init__(parent, bg=bg, fg=fg, bd=bd, relief=relief, font=font, *args, **kwargs)
    
     # Variables
     self.part_name = StringVar()
     self.part_cost = StringVar()
     self.part_qty = StringVar()
     self.part_labour = StringVar()
     self.part_amount = StringVar()

    self.part_cost.set("0")
    self.part_qty.set("1")
    self.part_labour.set("0")

    btn_font = tkFont.Font(family="Noto Sans", size=15, weight="bold")
    entry_font = tkFont.Font(family="Noto Sans", size=15, weight="bold")
    entry_label_font1 = tkFont.Font(family="Roboto", size=17, weight="bold")
    entry_label_font2 = tkFont.Font(family="Roboto", size=15, weight="bold")

    bg_color1 = "#ff704d"

    # Widgets and Frames
    btn_frame = Frame(self, bd=0, bg=bg_color1)
    btn_frame.grid(row=0, column=1)

    self.add_part_txt = tk.Entry(self, textvariable=self.part_name, width=30, font=entry_font, bd=8, relief=SUNKEN)
    self.add_part_txt.grid(row=0, column=0, pady=4, padx=10)

    add_part_btn = tk.Button(btn_frame, text="Add Part", font=btn_font, bd=8, width=18, command=self.add_part)
    add_part_btn.grid(row=0, column=1)

    self.part_filter_list = Listbox(self, font="Cosmicsan 15 bold", width=30, height=10, bd=8, relief=GROOVE)
    self.part_filter_list.grid(row=1, column=0, padx=10)

    self.part_filter_list.bind("<<ListboxSelect>>", self.show_selected_part)
    self.add_part_txt.bind("<KeyRelease>", self.sort_parts)

    selected_part_details = LabelFrame(self, text="Part Details", bg=bg_color1, fg="white", font="Poppins 17 bold", bd=6, relief=GROOVE)
    selected_part_details.grid(row=1, column=1)

    part_cost_lbl = tk.Label(selected_part_details, text="Part Unit Cost", bg=bg_color1, fg="yellow", font=entry_label_font2)
    part_qty_lbl = tk.Label(selected_part_details, text="Part Quantity", bg=bg_color1, fg="yellow", font=entry_label_font2)
    part_labour_lbl = tk.Label(selected_part_details, text="Part Labour", bg=bg_color1, fg="yellow", font=entry_label_font2)
    
    part_cost_lbl.grid(row=0, column=1, padx=12, pady=5, sticky="W")
    part_qty_lbl.grid(row=1, column=1, padx=12, pady=5, sticky="W")
    part_labour_lbl.grid(row=2, column=1, padx=12, pady=5, sticky="W")
    
    part_cost_txt = tk.Entry(selected_part_details, textvariable=self.part_cost, width=10, font=entry_font, bd=8, relief=SUNKEN)
    part_qty_txt = tk.Entry(selected_part_details, textvariable=self.part_qty, width=10, font=entry_font, bd=8, relief=SUNKEN)
    part_labour_txt = tk.Entry(selected_part_details, textvariable=self.part_labour, width=10, font=entry_font, bd=8, relief=SUNKEN)
    
    part_cost_txt.grid(row=0, column=2)
    part_qty_txt.grid(row=1, column=2)
    part_labour_txt.grid(row=2, column=2)

    amount_btn = tk.Button(selected_part_details, bd=10, relief=RAISED, text="Total Amount", bg="#260d0d", fg="white", font=entry_label_font1, command=self.total_part_cost)
    amount_txt = tk.Entry(selected_part_details, textvariable=self.part_amount,  width=10, bg="#260d0d", fg="white", font=entry_font, bd=10, relief=SUNKEN)

    amount_btn.grid(row=4, column=1, pady=5)
    amount_txt.grid(row=4, column=2)

def add_part(self):
    bill_window = BillWindow(None)
    parts_table = bill_window.parts_table
    
    part_name = self.part_name.get()
    part_cost = self.part_cost.get()
    part_qty = self.part_qty.get()
    part_labour = self.part_labour.get()
    part_amount = self.part_amount.get()

    if part_name != "" and int(part_cost) > 0 and int(part_qty) > 0 and int(part_labour) >= 0 and int(part_amount) > 0:
        # Adding parts in parts list and in parts table
        global count
        added_parts_list.append([count, part_name, int(part_cost), int(part_qty), int(part_labour), int(part_amount)])
        added_parts_table_list.append([count, part_name, f'Rs. {part_cost}', int(part_qty), f'Rs. {part_labour}', f'Rs. {part_amount}'])
        bill_window.parts_table.insert(parent='', index='end', iid=count, text=count, values=(part_name, f'Rs. {part_cost}', part_qty, f'Rs. {part_labour}', f'Rs. {part_amount}'))
        count+=1

class BillWindow(tk.LabelFrame):
     def __init__(self, parent, bg="#ff704d", fg="black", bd=6, relief=GROOVE, font="Poppins 20 bold", *args, **kwargs):
        super().__init__(parent, bg=bg, fg=fg, bd=bd, relief=relief, font=font, *args, **kwargs)

    # Parts Table
    parts_table_frame = tk.Frame(self, bd=5, relief=SUNKEN)
    parts_table_frame.grid(row=1, column=1, sticky="ne")

    scroll_y = tk.Scrollbar(parts_table_frame, orient="vertical")

    self.parts_table = ttk.Treeview(parts_table_frame, yscrollcommand=scroll_y.set)

    table_style = ttk.Style()
    table_style.configure("Treeview",
                    background = "silver",         
                    foreground = "black",
                    rowheight=28,
                    )
    table_style.map('Treeview', background=[('selected', f'{bg_color1}')], foreground=[('selected', 'white')])

    self.parts_table['columns'] = ("Description", "Unit Cost", "Quantity", "Labour", "Amount")

    self.parts_table.column("#0", width=38, minwidth=38)
    self.parts_table.column("Description", width=200, minwidth=200)
    self.parts_table.column("Unit Cost", width=70, minwidth=70)
    self.parts_table.column("Quantity", width=54, minwidth=54)
    self.parts_table.column("Labour", width=60, minwidth=60)
    self.parts_table.column("Amount", width=70, minwidth=70)

    self.parts_table.heading("#0", text="Sr.No")
    self.parts_table.heading("Description", text="Description")
    self.parts_table.heading("Unit Cost", text="Unit Cost")
    self.parts_table.heading("Quantity", text="Quantity")
    self.parts_table.heading("Labour", text="Labour")
    self.parts_table.heading("Amount", text="Amount")
    
    scroll_y.pack(side=RIGHT, fill=Y)
    scroll_y.config(command=self.parts_table.yview)
    self.parts_table.pack(side=TOP, fill="both")

    self.grid_columnconfigure((0,1,2,3), weight=1)

root = tk.Tk()

parts_details = PartsDetials(root, text="Part Detials")
parts_details.pack(fill="both", side="left", anchor="nw", expand=False)

bill_window = BillWindow(root, text="Bill Window")
bill_window.pack(fill="both")

root.mainloop()

我通过创建 BillWindow() class 的实例来使用另一个 class 的 treeview。 但我无法添加 treeview。 请在这件事上给予我帮助 !!!

谢谢你的帮助 !!!

每当执行add_part() () 时,您就创建了BillWindow()的新实例,然后将记录添加到其中的 treeview。 这个实例是不可见的,因为它没有.pack().grid()

删除add_part()中的以下两行:

def add_part(self):
    # should not create new instance of BillWindow() here
    # use the one created in main block
    #bill_window = BillWindow(None)
    #parts_table = bill_window.parts_table
    ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM