2017-09-25 6 views
0

Actuellement j'utilise un Treeview. Le problème est que j'utilise un assez grand ensemble de données. Pour que l'interface graphique ne soit pas massive, j'ai limité la taille de l'arborescence à la fenêtre et ajouté des barres de défilement verticales et horizontales. Il affiche les données exactement comme je veux, mais il y a des problèmes de vitesse lors du défilement dans chaque direction. Existe-t-il un moyen meilleur/plus rapide d'afficher des données de type tableur.Comment afficher une feuille de calcul déroulante dans Tkinter?

+0

Avez-vous besoin d'utilisateurs pour pouvoir mettre à jour des cellules dans la feuille de calcul ou toutes les données sont-elles statiques et chargées/calculées par le programme? ? –

+0

@EthanField Avoir des données modifiables serait bien. Cependant, si avoir des données statiques le rendrait beaucoup plus rapide, je serais certainement ouvert à une approche statique. – Roars

+1

Les deux sont possibles et les deux devraient se comporter très bien en termes de réactivité, mais avoir des formes éditables est beaucoup plus en profondeur. Existe-t-il une raison pour laquelle Excel ne suffirait pas si vous avez besoin d'une entrée directe? –

Répondre

1

J'ai fini à l'aide pandastable (https://github.com/dmnfarrell/pandastable). Comme il a fourni un moyen rapide et facile d'afficher des données dans une feuille de calcul de la même manière. Il offre également de nombreuses fonctions intégrées, telles que: trier, filtrer et appliquer des fonctions aux colonnes

+1

incroyable que ce soit essentiellement une toile tkinter avec des lignes droites et le texte dessiné, vraiment dommage que quelqu'un en développement tcl n'a pas écrit un bon widget de table en C pour tkinter – citizen2077

1

La solution ci-dessous est broyée ensemble mais devrait atteindre le résultat souhaité. Je vais écrire une explication quand je reçois la chance:

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