2017-09-25 510 views
0

目前我正在使用Treeview。问题是我正在使用相当大的数据集。为了使GUI不是很大,我限制了Treeview的大小以适应窗口并添加了垂直和水平滚动条。它显示我想要的数据,但在每个方向滚动时都有速度问题。有没有更好/更快的方式来显示类似电子表格的数据。如何在Tkinter中显示可滚动的电子表格?

+0

您是否需要用户能够更新电子表格中的单元格,还是所有数据都是静态的并且由程序加载/计算? –

+0

@EthanField有可编辑的数据会很好。但是,如果有静态数据会使它快很多,我肯定会打开一个静态的方法。 – Roars

+1

两者都是可能的,两者在响应性方面都应该表现得非常好,但是具有可编辑形式的内容更深入。如果您确实要求Excel可以直接输入,Excel有没有足够的理由支持它? –

回答

1

我结束了使用pandastable(https://github.com/dmnfarrell/pandastable):当我得到机会,我会为它编写一个解释。因为它提供了一种以类似方式在电子表格中显示数据的快捷方式。它还提供了许多内置的功能,例如:对列进行排序,过滤和应用功能

+1

令人惊讶的是,它基本上是一个tkinter画布,用直线和文本绘制,真正的耻辱,有人开发tcl没有在C中为tkinter编写适当的表格小部件 – citizen2077

1

下面的解决方案拼凑在一起,但应达到预期的结果。

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()