2017-03-08 15 views
7

現在、スプレッドシート形式でpandasデータフレームを表示する機能を使用しています。私は、コンテンツに基づいてツリービューの個々のセルを書式設定するためにいくつかの機能を追加できるようにしたいと考えています。彼らは「X」サブストリングまたはその値は次のように現在実装更新機能があるY.tkinterの全行ではなく個々のセル/項目をフォーマットするttkツリービュー

よりも高い場合には含まれている場合:

def updateTree(self, dataframe): 
    ''' 
    Updates the treeview with the data in the dataframe 
    parameter 
    ''' 
    #Remove any nan values which may have appeared in the dataframe parameter 
    df = dataframe.replace(np.nan,'', regex=True) 

    #Currently displayed data 
    self.treesubsetdata = dataframe 

    #Remove existing items 
    for item in self.tree.get_children(): self.tree.delete(item) 
    #Recreate from scratch the columns based on the passed dataframe 
    self.tree.config(columns= []) 
    self.tree.config(columns= list(dataframe.columns)) 

    #Ensure all columns are considered strings and write column headers 
    for col in dataframe.columns: 
     self.tree.heading(col,text=str(col)) 

    #Get number of rows and columns in the imported script 
    self.rows,self.cols = dataframe.shape 

    #Populate data in the treeview 
    for row in dataframe.itertuples(): 
     self.tree.insert('', 'end',values = tuple(row[1:])) 

    #Minimise first column 
    self.tree.column('#0',width=0) 
    self.tree.update() 

誰もがあなたが実際には、個々のセルを編集できることを確認することができます振り返る?

「はい」の場合は、これをどのように実装することができますか?

+0

私はそれが可能だとは思いません。代わりに、LabelまたはEntryウィジェットの単純なグリッドを作成したくない理由がありますか? – Novel

+0

カスタムクラスを使用して、スクロールバーの作成、表示、追加、表示されたデータのバインドされたキーを使用した複雑なソートとフィルタの更新と実行を行います。私はこの時点でフレームワークを改訂できるかどうかはわかりません。それが可能でない場合、私は機能を再考する必要がありますね。 – user3535074

答えて

1

ツリービューで個々のセルのスタイルを設定することはできません。行全体のみがタグ属性を使用できます。

値の表が必要な場合は、ttk.Labelウィジェットを使用することをお勧めします。このウィジェットは膨大な数の方法でフォーマットできます。たとえば:

import Tkinter as tk 
import ttk 
import pandas as pd 
from random import randrange 

PADDING = dict(padx=3, pady=3) 
class GridView(tk.Frame): 
    def __init__(self, master=None, **kwargs): 
     tk.Frame.__init__(self, master, **kwargs) 
     self.labels = [] 
     style = ttk.Style() 
     style.configure("red.TLabel", background='red') 
     style.configure("green.TLabel", background='green') 
     style.configure("header.TLabel", font = '-weight bold') 

    def set(self, df): 
     self.clear() 
     for col, name in enumerate(df.columns): 
      lbl = ttk.Label(self, text=name, style='header.TLabel') 
      lbl.grid(row=0, column=col, **PADDING) 
      self.labels.append(lbl) 

     for row, values in enumerate(df.itertuples(), 1): 
      for col, value in enumerate(values[1:]): 
       lbl = ttk.Label(self, text=value, style=self.get_style(value)) 
       lbl.grid(row=row, column=col, **PADDING) 
       self.labels.append(lbl) 

    @staticmethod 
    def get_style(value): 
     if value > 70: 
      return "red.TLabel" 
     elif value < 30: 
      return "green.TLabel" 
     else: 
      return None 

    def clear(self): 
     for lbl in self.labels: 
      lbl.grid_forget() 
     self.labels = [] 

class GUI(tk.Frame): 
    def __init__(self, master=None, **kwargs): 
     tk.Frame.__init__(self, master, **kwargs) 
     self.table = GridView(self) 
     self.table.pack() 
     btn = ttk.Button(self, text="populate", command=self.populate) 
     btn.pack() 
     btn = ttk.Button(self, text="clear", command=self.table.clear) 
     btn.pack() 

    def populate(self): 
     self.table.set(new_rand_df()) 

def main(): 
    root = tk.Tk() 
    win = GUI(root) 
    win.pack() 
    root.mainloop() 

def new_rand_df(): 
    width = 5 
    height = 5 
    return pd.DataFrame([[randrange(100) for _ in range(width)] for _ in range(height)], columns = list('abcdefghijklmnopqrstuvwxyz'[:width])) 

if __name__ == '__main__': 
    main() 
+0

伝統的なttk.Treeviewでは、私が望むことをするのは不可能だと思われるので、代替ソリューションを詳細に提案するためのJonathanの答えを受け入れます。 – user3535074

1

これはGtk3でカスタムのCellRendererを使用して可能である、例えば:

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, GObject 


class My_CellRendererText(Gtk.CellRendererText): 
    def __init__(self): 
     super().__init__() 

    def do_render(self, cr, widget, background_area, cell_area, flags): 
     cell_text = self.props.text 
     self.props.underline = ("X" in cell_text) 
     self.props.weight = 700 if (cell_text.isdigit() and int(cell_text) > 3) else 400 
     return Gtk.CellRendererText.do_render(self, cr, widget, background_area, cell_area, flags) 

GObject.type_register(My_CellRendererText) 
+0

これはttk Treeviewで使用できますか?または、Gtkを使用してGUIをゼロから構築する必要がありますか? – user3535074

+0

はいこのcellrendererにはGtk.Treeviewが必要です。私はそれがttkで動作するように作られているかどうかわかりませんが、私はそうではないと思います。 –

関連する問題