Search code examples
pythontkintertreeview

When updating a record in tkinter treeview, the .get info is updating the correct field, but why is it displaying under the wrong header?


Pulling from a database in tkinter treeview. Data is populating correctly, and is coded to fall under the correct header. However, when I go to update a record, the correct field gets updated, but the new information, and rest of info, moves/displays to/under incorrect headers. Is there a way to get it to stay in/under the correct header, or is my code incorrect somewhere? Sample code below for review. I have tried many iterations, but keep coming back to bolded part below, and it seems to be switching where it displays the updated information. Any and all help, thoughts, and/or suggestions Appreciated. Thanks.

my_tree = ttk.Treeview(tree_frame, yscrollcommand=tree_scroll.set, selectmode="extended")
my_tree.pack()

my_tree['columns'] = ("User", "Full Name", "Location", "Drawer 1", "Drawer 2", "Drawer 3", "Supervisor")

my_tree.column("#0", width=0, stretch=NO)
my_tree.column("User", anchor=W, width=140)
my_tree.column("Full Name", anchor=W, width=140)
my_tree.column("Location", anchor=W, width=175)
my_tree.column("Drawer 1", anchor=W, width=140)
my_tree.column("Drawer 2", anchor=W, width=140)
my_tree.column("Drawer 3", anchor=W, width=140)
my_tree.column("Supervisor", anchor=W, width=140)

my_tree.heading("#0", text="", anchor=W)
my_tree.heading("User", text="User", anchor=W)
my_tree.heading("Full Name", text="Full Name", anchor=W)
my_tree.heading("Location", text="Location", anchor=W)
my_tree.heading("Drawer 1", text="Drawer 1", anchor=W)
my_tree.heading("Drawer 2", text="Drawer 2", anchor=W)
my_tree.heading("Drawer 3", text="Drawer 3", anchor=W)
my_tree.heading("Supervisor", text="Supervisor", anchor=W)


  for record in records:
    supervisor_value = 'Y' if record[5] else 'N'  # Convert True to 'Y' and False to 'N'
    active_value = 'Yes' if record[2] else 'No' 
    create_value = 'Yes' if record[4] else 'No' 
    void_value = 'Yes' if record[6] else 'No' 
    reconcile_value = 'Yes' if record[7] else 'No'
    drawer_value = 'Yes' if record[8] else 'No'
    my_tree.insert(parent='', index='end', iid=record[0], text='', values=(record[0], record[3], record[1], record[9], record[10], record[11], supervisor_value, create_value, void_value, active_value, reconcile_value, drawer_value), tags=(my_tag))
               


#CLEAR ENTRY BOXES
def clear_entries():
    loc_entry.delete(0, END)
    active_check.delete(0, END)
    casr_entry.delete(0, END)
    fn_entry.delete(0, END)
    create_check.delete(0, END)
    superv_check.delete(0, END)
    void_check.delete(0, END)
    recon_check.delete(0, END)
    drwer_check.delete(0, END)
    draw1_entry.delete(0, END)
    draw2_entry.delete(0, END)
    draw3_entry.delete(0, END)

    
    #GRAB RECORD NUMBER
    selected = my_tree.focus()
    #GRAB RECORD VALUES
    values = my_tree.item(selected, 'values')
    #OUTPUT TO BOXES
    loc_entry.insert(0, values[2])
    active_check.insert(0, values[9])
    casr_entry.insert(0, values[0])
    fn_entry.insert(0, values[1])
    create_check.insert(0, values[7])
    superv_check.insert(0, values[6])
    void_check.insert(0, values[8])
    recon_check.insert(0, values[10])
    drwer_check.insert(0, values[11])
    draw1_entry.insert(0, values[3])
    draw2_entry.insert(0, values[4])
    draw3_entry.insert(0, values[5])
        
def update_record():
    #GRAB THE RECORD NUMBER
    selected = my_tree.focus()
    #UPDATE RECORD
    my_tree.item(selected, text="", values=(loc_entry.get(), active_check.get(), casr_entry.get(), fn_entry.get(), create_check.get(), superv_check.get(), void_check.get(), recon_check.get(), drwer_check.get(), draw1_entry.get(), draw2_entry.get(), draw3_entry.get(), ))
    

#CLEAR ENTRY BOXES
    loc_entry.delete(0, END)
    active_check.delete(0, END)
    casr_entry.delete(0, END)
    fn_entry.delete(0, END)
    create_check.delete(0, END)
    superv_check.delete(0, END)
    void_check.delete(0, END)
    recon_check.delete(0, END)
    drwer_check.delete(0, END)
    draw1_entry.delete(0, END)
    draw2_entry.delete(0, END)
    draw3_entry.delete(0, END)


updt_button = Button(edit_frame, text = "Update Cashier", font = 'Helvetica 12 bold', background ='light gray', command=update_record)
updt_button.grid(row=0, column=1, padx=10, pady=10)    

slt_button = Button(edit_frame, text = "Clear Boxes", font = 'Helvetica 12 bold', background ='light gray', command = clear_entries)
slt_button.grid(row=0, column=2, padx=10, pady=10)    

#BIND THE TREEVIEW
my_tree.bind("<ButtonRelease-1>", select)

Images below are sample examples made in Excel:

Before Entry is Updated

After Update Button Clicked

Have tried requerying the database, pulling the information in again after update-but doubles up. The Updated information goes to the correct field, it is changing where it displays, so have tried moving the fields around but no luck.


Solution

  • Note that the order of the values for values option of my_tree.item(...) inside update_record() should be as below:

    def update_record():
        #GRAB THE RECORD NUMBER
        selected = my_tree.focus()
        #UPDATE RECORD
        my_tree.item(selected, text="",
                     values=(
                         casr_entry.get(),
                         fn_entry.get(),
                         loc_entry.get(),
                         draw1_entry.get(),
                         draw2_entry.get(),
                         draw3_entry.get(),
                         superv_check.get(),
                         create_check.get(),
                         void_check.get(),
                         active_check.get(),
                         recon_check.get(),
                         drwer_check.get()
                     ))
        ...