使用 Tkinter 显示 Excel 工作表并添加行,还提供更新任何框中存储的信息的选项

问题描述 投票:0回答:1

我研究了一些已经可用的 tkinter treeview 单元更新逻辑,我认为这是来自 https://www.youtube.com/watch?v=n5gItcGgIkk&t=2368s 的最佳解决方案。如果我们还有其他解决方案,请告诉我。

python-3.x excel tkinter treeview
1个回答
0
投票
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()
© www.soinside.com 2019 - 2024. All rights reserved.