提问人:Nando7789 提问时间:11/1/2023 更新时间:11/1/2023 访问量:48
Python 在不更改大小的情况下更新 Treeview 上的信息
Python Update info on Treeview without changing the size
问:
我有这段代码,我从 Excel 文件中读取并将其显示在 tkinter 应用程序的 Treeview 上。当程序启动时,Treeview 有一个大小,但是当我按下按钮再次打开文件时,它会改变大小并留下很多非覆盖部分。代码如下:
import pandas as pd
from tkinter import *
from tkinter import ttk, filedialog
import numpy as np
import datetime
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import plotly.express as px
def opendir():
filename = filedialog.askopenfilename(
initialdir="C:/Inversiones/",
title="Open a File", filetype=(("xlsx files", "*.xlsx"),
("All Files", "*.*"))
)
LoadDashboard(filename)
def buttonopendir():
filename = path
LoadDashboard(filename)
def loadTable(Filename, SheetName):
if Filename:
try:
filename = r"{}".format(Filename)
df = pd.read_excel(filename, sheet_name=SheetName)
except ValueError:
lblFileStatus.config(text="File Couldn't opened...try again")
except FileNotFoundError:
lblFileStatus.config(text="File Couldn't found...try again")
return df
def ONPanel():
filename = path
df = loadTable(filename, 'InfoONs')
clear_tree(treeDashboard)
tickerlist['Tickers'] = list(df['Ticker ARS'])
treeDashboard["columns"] = list(df.columns)
treeDashboard["show"] = "headings"
ColWidth = [70, 70, 230, 115, 40,
50, 45, 70, 80, 80,
120, 80, 80, 80, 30,
40, 115, 100, 70, 60]
i = 0
for column in treeDashboard["column"]:
treeDashboard.column(column, width=ColWidth[i], stretch=NO)
treeDashboard.heading(column, text=column, anchor=W)
i += 1
df_rows = df.to_numpy().tolist()
for row in df_rows:
treeDashboard.insert("", "end", values=row)
my_scroll1.config(command=treeDashboard.yview)
for col in treeDashboard["columns"]:
treeDashboard.heading(
col, text=col, command=lambda c=col: sort_treeview(treeDashboard, c, False))
treeDashboard.config(selectmode="extended")
treeDashboard.pack()
def clear_tree(tree):
tree.delete(*tree.get_children())
def sort_treeview(tree, col, descending):
data = [(tree.set(item, col), item) for item in tree.get_children('')]
data.sort(reverse=descending)
for index, (val, item) in enumerate(data):
tree.move(item, '', index)
tree.heading(col, command=lambda: sort_treeview(tree, col, not descending))
WIDTH = 1800
HEIGHT = 1000
path = 'C:/Inversiones/ONs.xlsx'
tickerlist = {}
root = Tk()
root.title("Obligaciones Negociables")
root.geometry(str(WIDTH)+"x"+str(HEIGHT))
# Recuadro para la Pestaña Dashboard
my_frame1 = ttk.Frame(root, border=5)
my_frame1.pack()
# Recuadro para los Botones
my_subframe = ttk.Frame(my_frame1)
my_subframe.pack()
btnOpenExcel = Button(my_subframe, text="Abrir Excel", command=ONPanel)
btnOpenExcel.grid(row=0, column=0, padx=30)
lblFileStatus = Label(my_subframe, text='Archivo sin actualizar')
lblFileStatus.grid(row=0, column=1, padx=30)
# Recuadro para el Dashboard
my_subframe2 = ttk.Frame(my_frame1, height=500, width=1625)
my_subframe2.pack()
my_scroll1 = Scrollbar(my_subframe2)
my_scroll1.pack(side=RIGHT, fill=Y)
treeDashboard = ttk.Treeview(
my_subframe2, yscrollcommand=my_scroll1.set, selectmode="extended", height=37)
ONPanel()
# Configuro el menu
my_menu = Menu(root)
root.config(menu=my_menu)
file_menu = Menu(my_menu, tearoff=False)
my_menu.add_cascade(label="File", menu=file_menu)
file_menu.add_command(label="Open", command=opendir)
root.mainloop()
这是表格 从我读到的数据:
股票代码 ARS | 股票代码 USD | 恩普雷萨 | 文西米恩托 | 氖; | 多拉尔 | 帕戈斯 | 闵诺姆 | VN可乐果 | 摊销 | 工业 | Precio 美元 | 卷 | Precio ARS | 医学博士 | TIR | Prox Cupon(普罗克斯杯酒店) | 迪亚斯·普罗克斯·库蓬 | 多拉尔 MEP | 雷托尔诺 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
AEC1O认证 | AEC1D认证 | AES Argentina Generacion S.A.(AES阿根廷Generacion S.A.公司) | 2025-07-14 00:00:00 | 精 氨 酸 | 环保部 | SEM | 1 | 30513915 | 子弹 | 能量 | 107 | 3397074 | 88000 | 1,52 | 5,18 | 2024-01-14 00:00:00 | 78 | 822,43 | 116,02 |
ARC1O型 | ARC1D型 | 阿根廷航空 | 2031-08-01 00:00:00 | 纽约 | 电缆 | 三 | 1000 | 208949631 | 无子弹 | Turismo(图里斯摩酒店) | 99,4 | 105380784,6 | 83248 | 3,61 | 9,5 | 2023-11-01 00:00:00 | 4 | 837,51 | 144,68 |
碳化钙2O | CAC2D(CAC2D) | 资本支出 Clase 2 2024 | 2024-05-15 00:00:00 | 精 氨 酸 | 电缆 | 扫描电镜 | 1000 | 300000000 | 子弹 | 能量 | 108 | 0 | 98000 | 0,54 | -1,96 | 2023-11-15 00:00:00 | 18 | 907,41 | 106,88 |
CP17O型 | CP17D型 | COMPAÑIA GENERAL DE COMBUSTIBLES | 2025-03-08 00:00:00 | 纽约 | 电缆 | 扫描电镜 | 1000 | 196110000 | 无子弹 | 能量 | 63 | 0 | 54745 | 0,93 | 6 | 2024-03-08 00:00:00 | 132 | 868,97 | 66,77 |
CP25O型 | CP25D系列 | COMPAÑIA GENERAL DE COMBUSTIBLES S.A. | 2024-02-25 00:00:00 | 精 氨 酸 | 环保部 | 三 | 1 | 11287128 | 子弹 | 能量 | 109,5 | 0 | 99900 | 0,42 | -20,57 | 2023-11-25 00:00:00 | 28 | 912,33 | 101,62 |
答:
0赞
Andrej Kesely
11/1/2023
#1
我能想到的修复它的最简单方法是从头开始重新创建:tk.TreeView
import datetime
from tkinter import *
from tkinter import filedialog, ttk
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import plotly.express as px
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
def opendir():
filename = filedialog.askopenfilename(
initialdir=".",
title="Open a File",
filetype=(("xlsx files", "*.xlsx"), ("All Files", "*.*")),
)
LoadDashboard(filename)
def buttonopendir():
filename = path
LoadDashboard(filename)
def loadTable(Filename, SheetName):
if Filename:
filename = r"{}".format(Filename)
df = pd.read_excel(filename, sheet_name=SheetName)
return df
def ONPanel():
global treeDashboard
if treeDashboard:
treeDashboard.pack_forget()
treeDashboard = ttk.Treeview(
my_subframe2, yscrollcommand=my_scroll1.set, selectmode="extended", height=37
)
filename = path
df = loadTable(filename, "InfoONs")
clear_tree(treeDashboard)
tickerlist["Tickers"] = list(df["Ticker ARS"])
treeDashboard["columns"] = list(df.columns)
treeDashboard["show"] = "headings"
ColWidth = [
70,
70,
230,
115,
40,
50,
45,
70,
80,
80,
120,
80,
80,
80,
30,
40,
115,
100,
70,
60,
]
i = 0
for column in treeDashboard["column"]:
treeDashboard.column(column, width=ColWidth[i], stretch=NO)
treeDashboard.heading(column, text=column, anchor=W)
i += 1
df_rows = df.to_numpy().tolist()
for row in df_rows:
treeDashboard.insert("", "end", values=row)
my_scroll1.config(command=treeDashboard.yview)
for col in treeDashboard["columns"]:
treeDashboard.heading(
col, text=col, command=lambda c=col: sort_treeview(treeDashboard, c, False)
)
treeDashboard.config(selectmode="extended")
treeDashboard.pack()
def clear_tree(tree):
tree.delete(*tree.get_children())
def sort_treeview(tree, col, descending):
data = [(tree.set(item, col), item) for item in tree.get_children("")]
data.sort(reverse=descending)
for index, (val, item) in enumerate(data):
tree.move(item, "", index)
tree.heading(col, command=lambda: sort_treeview(tree, col, not descending))
WIDTH = 1800
HEIGHT = 1000
path = "data.xlsx"
tickerlist = {}
root = Tk()
root.title("Obligaciones Negociables")
root.geometry(str(WIDTH) + "x" + str(HEIGHT))
# Recuadro para la Pestaña Dashboard
my_frame1 = ttk.Frame(root, border=5)
my_frame1.pack()
# Recuadro para los Botones
my_subframe = ttk.Frame(my_frame1)
my_subframe.pack()
btnOpenExcel = Button(my_subframe, text="Abrir Excel", command=ONPanel)
btnOpenExcel.grid(row=0, column=0, padx=30)
lblFileStatus = Label(my_subframe, text="Archivo sin actualizar")
lblFileStatus.grid(row=0, column=1, padx=30)
# Recuadro para el Dashboard
my_subframe2 = ttk.Frame(my_frame1, height=500, width=1625)
my_subframe2.pack()
my_scroll1 = Scrollbar(my_subframe2)
my_scroll1.pack(side=RIGHT, fill=Y)
treeDashboard = None
ONPanel()
# Configuro el menu
my_menu = Menu(root)
root.config(menu=my_menu)
file_menu = Menu(my_menu, tearoff=False)
my_menu.add_cascade(label="File", menu=file_menu)
file_menu.add_command(label="Open", command=opendir)
root.mainloop()
创建此应用程序(单击打开的文件将保留比例):
评论
treeDashboard.pack_forget()
treeDashboad["columns"] = list(df.columns)
ONPanel()