Treeview内リストを固定幅にし、横スクロールバーを有効にしたい。
解決策をご存知の方にご教示をお願いいたします。
実現したいこと
大きさの決まったダイアログおよびLabelFrame内で、Treeviewを使用して表を表示したいです。
表は見やすいように、カラムを項目に合わせて固定幅とします。そのため、決められた大きさの中で、Treeview上の表は表示しきれないので、縦横のスクロールバーが埋め込む有効な状態としたいです。
現在の問題点
・Treeview上の表全体の幅が収めたい幅にならない。
・Treeviewの幅が抑えられないので、横スクロールバーが有効にならない。
サンプルコード
LabelFrame内にTreeviewおよびscrollbarを配置します。
Treeviewには全体の幅するオプションがないので、LabelFrame.columnconfigureで指定するが無視されて、Treeviewの表データに合わせた幅になってしまっています。
試したこと
以下のリンクについて、試しました。
私の用途では、place()による配置は適していないため、2つ目のリンクの内容は参考になりませんでした。
Horizontal scrolling won't activate for ttk Treeview widget
python ttk Notebookにtreeviewをグリッドで配置した時にスクロールバーが収まらない
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import ttk
class CreateScreen(object):
def __init__(self):
self.screen_w = 300
self.screen_h = 200
self.dlg_pos_x = 10
self.dlg_pos_y = 10
return super().__init__()
def createMainWindow(self):
obj = ttk.tkinter.Tk()
geo_string = str(self.screen_w) + "x" + str(self.screen_h) + "+" + str(self.dlg_pos_x) + "+" + str(self.dlg_pos_y)
obj.geometry(geo_string)
_InFrame_ = ttk.LabelFrame(
obj,
width = self.screen_w,
height = self.screen_h,
text = "決められた幅のフレーム内で表示したい。",
)
_TreeList_ = ttk.Treeview(
_InFrame_,
selectmode = 'none',
show = "headings",
height = 6,
)
tree_h_scroll = ttk.Scrollbar(
_InFrame_,
orient = tk.HORIZONTAL,
command = _TreeList_.xview
)
tree_v_scroll = ttk.Scrollbar(
_InFrame_,
orient = tk.VERTICAL,
command = _TreeList_.yview
)
_TreeList_['xscrollcommand'] = tree_h_scroll.set
_TreeList_['yscrollcommand'] = tree_v_scroll.set
tree = _TreeList_
tree["columns"]=(1,2,3,4,5,6)
tree.heading("#0",text = "")
tree.heading(1,text = "項")
tree.heading(2,text = "名前")
tree.heading(3,text = "型式")
tree.heading(4,text = "単価")
tree.heading(5,text = "在庫数")
tree.heading(6,text = "備考")
tree.column(1, width = 30, stretch = False)
tree.column(2, width = 100, stretch = False)
tree.column(3, width = 150, stretch = False)
tree.column(4, width = 50, stretch = False)
tree.column(5, width = 50, stretch = False)
tree.column(6, width = 150, stretch = False)
tree_value = list()
#適当にデータを埋め込む。
for i in range(32):
tree_value.append((i,"tree"+str(i),"T-"+str(i),i%5*1000+100,i%2*50,"*******"))
for ch, val in enumerate(tree_value):
tree.insert("",index = "end",tags = ch%2,value=val)
else:
tree.tag_configure(0,background = "lightcyan")
tree.tag_configure(1,background = "white")
_InFrame_.grid(padx = 5, pady = 5, ipadx = 5, ipady = 5)
_InFrame_.columnconfigure(0, minsize = 250)
_TreeList_.grid(row = 0,column = 0, sticky = tk.N+tk.S+tk.E+tk.W )
tree_h_scroll.grid(row = 1,column = 0,sticky = tk.EW )
tree_v_scroll.grid(row = 0,column = 1,sticky = tk.NS )
return obj
if __name__ == '__main__':
screen_obj = CreateScreen()
MainWindow_obj = screen_obj.createMainWindow()
MainWindow_obj.mainloop()