雑記帳

メモとやることとやったことと

Tkinterでテーブルもどき

一覧表が欲しい

あるデータベースのようなものから、データを引き出してきて並べて表示したいものの、Tkinterにテーブルはないっぽいし、Frameにスクロールバーが付けれないから、長いデータを表示できないし?

テーブルのつくるライブラリもあるようだけど、いろいろと混ぜ込むことができない状況だったので、代替案がないか探していた。

StackOverFlowに似たようなことで頭抱えていたひとがいて、そこにコメントしてあった代替案がttkのTreeViewを使えばよいといことだったので、真似をしてみた。

以下、コードをメモ

コード

class TreeTable(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        # 定義
        self.tree = ttk.Treeview(self, height=10)
        self.scroll = tk.Scrollbar(self, orient=tk.VERTICAL, command=self.tree.yview)
        # 設定
        self.tree.configure(yscroll=self.scroll.set)
        # 配置
        self.tree.grid(row=0, column=0)
        self.scroll.grid(row=0, column=1, sticky=tk.N+tk.S)

    # ヘッダのうち、一番左の幅とテキストを設定
    def setHeader(self, text, width):
        self.tree.column("#0", width=width)
        self.tree.heading("#0", text=text)

    # ヘッダのうち、上記以外に幅とテキストを設定
    def setColumns(self, texts, widths):
        self.columns_key = ['C'+str(i) for i in xrange(len(texts))]
        self.tree['columns'] = self.columns_key
        for key, value, width in zip(self.columns_key, texts, widths):
            self.tree.column(key, width=width)
            self.tree.heading(key, text=value)

    # 最初に一覧表に表示しておくデータを入力
    def setInitialView(self, data_set):
        for idx, v in enumerate(data_set):
            self.tree.insert("", idx, text=str(idx), values=v)
        self.idx = idx

    # 一覧表にデータを追加する
    def insertView(self, value):
        self.idx += 1
        self.tree.insert("", tk.END, text=str(self.idx), values=value)

項目の削除などは考えていないデス