我研究了一些已经可用的 tkinter treeview 单元更新逻辑,我认为这是来自 https://www.youtube.com/watch?v=n5gItcGgIkk&t=2368s 的最佳解决方案。如果我们还有其他解决方案,请告诉我。
import tkinter as tk
from tkinter import ttk
from openpyxl import load_workbook
import common
def entry_FocusOut(event):
event.widget.destroy()
print("entry widget destroyed")
def save_entry_cb_on_return(event):
new_text = event.widget.get()
selected_iid = event.widget.editing_item_iid
column_index = event.widget.editing_column_index
print("on enter working on",selected_iid,column_index)
current_values = tree.item(selected_iid).get("values")
print("old values",current_values)
current_values[column_index] = new_text
print("updated values",current_values)
tree.item(selected_iid,values=current_values)
event.widget.destroy()
def on_double_click(event):
print("on double click")
row = tree.identify_row(event.y)
print("doule click on row:",row)
column = tree.identify_column(event.x)
print("double clink on column:",column)
selected_iid = tree.focus()
selected_values = tree.item(selected_iid)
print("selected_values:",selected_values)
column_box = tree.bbox(selected_iid,column)
print("column box",column_box)
entry_edit = ttk.Entry(existing_f,width=column_box[2])
entry_edit.place(x=column_box[0],y=column_box[1],w=column_box[2],h=column_box[3])
column_index = int(column[1:])-1
entry_edit.editing_column_index = column_index
entry_edit.editing_item_iid = selected_iid
selected_text = selected_values.get("values")[column_index]
entry_edit.insert(0,selected_text)
entry_edit.select_range(0,tk.END)
entry_edit.focus()
entry_edit.bind("<FocusOut>",entry_FocusOut)
entry_edit.bind("<Return>",save_entry_cb_on_return)
last_value_tuple = ()
main_window = tk.Tk()
# path = "D:\codefirst.io\Tkinter Excel Viewer\list-countries-world.xlsx"
file_path = "./tmp/test.xlsx"
print("trying to load excel sheet:", file_path)
workbook = load_workbook(file_path)
sheet = workbook.active
list_values = list(sheet.values)
cols = list_values[0]
existing_f = tk.LabelFrame(main_window, text="Current info")
existing_f.place(height=250, width=1000)
# existing_f.pack(padx=20,pady=40)
tree = ttk.Treeview(existing_f, column=cols, show="headings")
for col_name in cols:
tree.heading(col_name, text=col_name)
tree.pack(expand=True, fill=tk.BOTH)
tree.bind("<Double-1>",on_double_click)
for value_tuple in list_values[1:]:
last_value_tuple = value_tuple
tree.insert('', tk.END, values=value_tuple)
def add_info_cb():
tree.insert('', tk.END, values=last_value_tuple)
print("into add_info cb")
def save_info_cb():
#workbook = load_workbook(filename='./tmp/updated.xlsx')
workbook = load_workbook(filename='./tmp/test.xlsx')
sheet = workbook['Sheet1']
sheet.delete_rows(2,sheet.max_row)
for row_id in tree.get_children():
row = tree.item(row_id)['values']
sheet.append(row)
workbook.save(filename='./tmp/updated.xlsx')
button = common.get_button("add info",main_window,add_info_cb)
button.pack(padx=20, pady=20)
button.place(x=600, y=400)
button = common.get_button("save",main_window,save_info_cb)
button.pack(padx=20, pady=20)
button.place(x=400, y=400)
main_window.mainloop()