应如何在 Tkinter 中显示可滚动的电子表格?
How should a scrollable spreadsheet be displayed within Tkinter?
目前我正在使用 Treeview。问题是我正在使用相当大的数据集。为了使 GUI 不那么庞大,我限制了 Treeview 的大小以适应 window 并添加了垂直和水平滚动条。它完全按照我想要的方式显示数据,但是在每个方向滚动时都存在速度问题。是否有 better/faster 方式来显示类似电子表格的数据。
以下解决方案拼凑而成,但应该会达到预期的结果:
from tkinter import *
class App:
def __init__(self, root):
self.entry = []
self.sv = []
self.root = root
self.canvas = Canvas(self.root, background="#ffffff", borderwidth=0)
self.frame = Frame(self.canvas, background="#ffffff")
self.scrolly = Scrollbar(self.root, orient="vertical", command=self.canvas.yview)
self.scrollx = Scrollbar(self.root, orient="horizontal", command=self.canvas.xview)
self.canvas.configure(yscrollcommand=self.scrolly.set)#, xscrollcommand=self.scrollx.set)
self.canvas.create_window((4,4), window=self.frame, anchor="nw", tags="self.frame")
self.scrolly.pack(side="left", fill="y")
self.canvas.pack(side="top", fill="both", expand=True)
self.scrollx.pack(side="bottom", fill="x")
self.frame.bind("<Configure>", self.onFrameConfigure)
for i in range(15):
self.entry.append([])
self.sv.append([])
for c in range(30):
self.sv[i].append(StringVar())
self.sv[i][c].trace("w", lambda name, index, mode, sv=self.sv[i][c], i=i, c=c: self.callback(sv, i, c))
self.entry[i].append(Entry(self.frame, textvariable=self.sv[i][c]).grid(row=c, column=i))
def onFrameConfigure(self, event):
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def callback(self, sv, column, row):
print("Column: "+str(column)+", Row: "+str(row)+" = "+sv.get())
root = Tk()
App(root)
root.mainloop()
我最终使用了 pandastable (https://github.com/dmnfarrell/pandastable)。因为它提供了一种快速简便的方式来以类似电子表格的方式显示数据。它还提供了许多内置功能,例如:排序、过滤和将函数应用于列
目前我正在使用 Treeview。问题是我正在使用相当大的数据集。为了使 GUI 不那么庞大,我限制了 Treeview 的大小以适应 window 并添加了垂直和水平滚动条。它完全按照我想要的方式显示数据,但是在每个方向滚动时都存在速度问题。是否有 better/faster 方式来显示类似电子表格的数据。
以下解决方案拼凑而成,但应该会达到预期的结果:
from tkinter import *
class App:
def __init__(self, root):
self.entry = []
self.sv = []
self.root = root
self.canvas = Canvas(self.root, background="#ffffff", borderwidth=0)
self.frame = Frame(self.canvas, background="#ffffff")
self.scrolly = Scrollbar(self.root, orient="vertical", command=self.canvas.yview)
self.scrollx = Scrollbar(self.root, orient="horizontal", command=self.canvas.xview)
self.canvas.configure(yscrollcommand=self.scrolly.set)#, xscrollcommand=self.scrollx.set)
self.canvas.create_window((4,4), window=self.frame, anchor="nw", tags="self.frame")
self.scrolly.pack(side="left", fill="y")
self.canvas.pack(side="top", fill="both", expand=True)
self.scrollx.pack(side="bottom", fill="x")
self.frame.bind("<Configure>", self.onFrameConfigure)
for i in range(15):
self.entry.append([])
self.sv.append([])
for c in range(30):
self.sv[i].append(StringVar())
self.sv[i][c].trace("w", lambda name, index, mode, sv=self.sv[i][c], i=i, c=c: self.callback(sv, i, c))
self.entry[i].append(Entry(self.frame, textvariable=self.sv[i][c]).grid(row=c, column=i))
def onFrameConfigure(self, event):
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def callback(self, sv, column, row):
print("Column: "+str(column)+", Row: "+str(row)+" = "+sv.get())
root = Tk()
App(root)
root.mainloop()
我最终使用了 pandastable (https://github.com/dmnfarrell/pandastable)。因为它提供了一种快速简便的方式来以类似电子表格的方式显示数据。它还提供了许多内置功能,例如:排序、过滤和将函数应用于列