【问题标题】:Cannot Add Items To Treeview In Tkinter Python无法在 Tkinter Python 中将项目添加到 Treeview
【发布时间】:2021-08-23 03:02:24
【问题描述】:

我正在开发一个 GUI。我在其中使用 OOP 使其工作。我创建了一个名为 add_part() 的函数,它将部件详细信息添加到树视图中。树视图正在另一个类中创建。

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() 类的实例来使用另一个类的树视图。但我无法在树视图中添加。请帮帮我!!!

感谢您的帮助!!!

【问题讨论】:

  • 您的代码看起来有点不完整。什么是self.show_selected_partself.sort_parts
  • 随便吧,他的两个是函数,和我的问题没有关系。我只发布了我的代码的必要部分
  • 没有它们,程序将无法运行,因为其中两个已在绑定函数中使用。
  • 所有其他功能都运行良好,我也可以从树视图中检索项目,但问题是我无法在树视图中插入任何项目。我在代码中做错了什么?我没有正确创建类的实例吗?
  • 你可以做的是在一个元组中创建一个元组并遍历主元组

标签: python oop user-interface tkinter interface


【解决方案1】:

每当执行add_part() 时,您就创建了BillWindow() 的新实例,然后将记录添加到其中的树视图中。此实例不可见,因为没有在其上调用 .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
    ...

【讨论】:

    猜你喜欢
    • 2018-03-28
    • 2023-04-06
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    相关资源
    最近更新 更多