代码之家  ›  专栏  ›  技术社区  ›  Roars

Tkinter中应如何显示可滚动的电子表格?

  •  2
  • Roars  · 技术社区  · 8 年前

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

    2 回复  |  直到 8 年前
        1
  •  4
  •   Roars    8 年前

    我最终使用了pandastable( https://github.com/dmnfarrell/pandastable ). 因为它提供了一种以类似电子表格的方式显示数据的快速简便方法。它还提供了许多内置功能,例如:排序、筛选和将函数应用于列

        2
  •  4
  •   Ethan Field    7 年前

    以下解决方案拼凑在一起,但应达到预期结果:

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