tkinter treeview表格调整列宽以后水平滚动条失效,各种搜索以后各种尝试无解,请各位看看,原因在那里
右侧表格,调整列宽以前滚动条正常

右侧表格,调整列宽以后滚动条变灰失效

代码如下:
#
#保险单管理程序主界面,界面组件定义和交互处理。
#
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
import load_data
import json
from functools import partial
def on_save_oper():
return
def on_help_how_to():
return
#button callback :applicant.
def cb_overview_applicant(tv,sysdata):
applicant_set_dict=sys_data["applicant_set"]
applicant_name_list=list(applicant_set_dict.keys())
docs=sysdata["docs"]
docs_area_width=sysdata["docs_area_width"]
#heading
tv.heading("#0",text="单号")
tv.heading("#1",text="类型")
tv.column("#0",width=6*docs_area_width["保单号"])
tv.column("#1",width=12*docs_area_width["保单类型"])
#id
item_dict_list=[]
for name in applicant_name_list:
doc_set=applicant_set_dict[name]
item_dict={}
item_dict["id"]=tv.insert("",index=END,text=name)
item_dict["name"]=name
for doc_index in doc_set:
doc_id=docs[doc_index]["保单号"]
doc_type=docs[doc_index]["保单类型"]
tv.insert(item_dict["id"],index=END,text=doc_id,values=doc_type)
item_dict_list.append(item_dict)
#open the items.
for item_dict in item_dict_list:
tv.item(item_dict["id"],open=True)
return
#button callback :insured.
def cb_overview_insured(tv,sysdata):
return
#button callback :beneficiary.
def cb_overview_beneficiary(tv,sysdata):
return
def main_table_fill(tv,sysdata):
docs_display=sysdata["docs_display"]
docs_area_width=sysdata["docs_area_width"]
main_table_column_display_width={}
#heading.
tv.heading("#0",text="序号")
tv.column("#0",width=40)
keys=list(docs_display[0].keys())
for i,key in enumerate(keys):
temp_str="#"+str(i+1)
tv.heading(temp_str,text=key)
#temp_width=int(2.2*docs_area_width[key])
temp_width=int(12*docs_area_width[key])
if(temp_width>120): temp_width=120
if(temp_width<40): temp_width=40
tv.column(temp_str,anchor="w",width=temp_width)
main_table_column_display_width[key]=temp_width
for i,doc in enumerate(docs_display):
values=[]
for key in keys:
obj_str=doc[key]
values.append(obj_str)
tv.insert("",index=END,text=str(i),values=values)
#store real columns' width for adjust HORIZONTAL scrollbar initial location.
sysdata["main_table_column_display_width"]=main_table_column_display_width
return
if __name__ == '__main__' :
#data structure for system
sys_data={}
#insurance_doc_file path.
insurance_data_file_path="./data/insurance-doc-mng.json"
user_data_file_path="./data/user.json"
#read data
result,docs,user =load_data.load(insurance_data_file_path,user_data_file_path)
if(False==result):
messagebox.showwarning("警告", "读取数据失败!")
sys_data["docs"]=docs
sys_data["user"]=user
sys_data["state"]="INITIAL"
sys_data["docs_display"]=load_data.get_docs_display_strs(docs)
sys_data["docs_area_width"]=load_data.get_docs_display_area_width(sys_data["docs_display"])
#get applicant set.
sys_data["applicant_set"]=load_data.get_applicant_doc_dict(docs)
#get insured set.
sys_data["insured_set"]=load_data.get_insured_doc_dict(docs)
#get beneficiary set.
sys_data["beneficiary_set"]=load_data.get_beneficiary_doc_dict(docs)
#temp to modify data.
#format_data(docs):
root = Tk()
root.title("保险单管理")
screen_width = root.winfo_screenwidth()*1.0
screen_height = root.winfo_screenheight()*1.0
screen_width=int(screen_width)
screen_height=int(screen_height)
hw_str=str(screen_width)+"x"+str(screen_height)
root.geometry(hw_str)
root.grid_columnconfigure(0, weight=1)
#for menu
menubar = Menu(root)
root.config(menu=menubar)
#root.columnconfigure(0, weight=1)
#root.columnconfigure(1, weight=1)
file_menu=Menu(menubar)
menubar.add_cascade(label="File",menu=file_menu)
file_menu.add_command(label="Save",command=on_save_oper)
help_menu=Menu(menubar)
menubar.add_cascade(label="Help",menu=help_menu)
help_menu.add_command(label="How to",command=on_help_how_to)
#for overview area.
fr_tree = LabelFrame(root, text="简略图")
#fr_tree.grid(sticky="nw",padx=1,pady=1,row=0,column=0)
fr_tree.pack(side="left", fill="y")
fr_tree.pack_propagate(0)
#fr_tree.grid_columnconfigure(0, weight=1)
fr_tree_button=LabelFrame(fr_tree, text="")
fr_tree_button.grid( sticky="nw",padx=1,pady=1,row=0,column=0)
fr_tree_button.grid_columnconfigure(0, weight=1)
fr_tree_list=LabelFrame(fr_tree, text="")
fr_tree_list.grid(sticky="nw",padx=1,pady=1,row=1,column=0)
fr_tree_list.grid_columnconfigure(0, weight=1)
#fr_tree_list.grid_propagate(0)
#for main area.
fr_main = LabelFrame(root, text="主视图")
#fr_main.grid(sticky=E,padx=1,pady=1,row=0,column=1)
fr_main.pack(side="left", fill="y")
#fr_main.grid_propagate(0)
fr_main.grid_columnconfigure(0, weight=1)
fr_input = LabelFrame(fr_main, text="策略编辑")
#fr_input.grid(sticky="nw",padx=1,pady=1,row=0,column=0)
fr_input.grid(sticky=W,padx=1,pady=1,row=0,column=0)
fr_table = LabelFrame(fr_main, text="内容表")
#fr_table.grid(sticky="nw",padx=1,pady=1,row=1,column=0)
#fr_table.grid(sticky="e",padx=1,pady=1,row=1,column=0)
fr_table.grid(sticky=E,padx=1,pady=1,row=1,column=0)
fr_table.grid_columnconfigure(1, weight=1)
#fr_table.grid_propagate(0)
#widgets for overview treeview.
over_view_tv = ttk.Treeview(master=fr_tree_list, height=35,columns=("保单类型"))
over_view_tv.grid(sticky="nw",padx=1,pady=1,row=1,column=0)
#button for over view select.
cb_overview_applicant_partial=partial(cb_overview_applicant,over_view_tv,sys_data)
cb_overview_insured_partial=partial(cb_overview_insured,over_view_tv,sys_data)
cb_overview_beneficiary_partial=partial(cb_overview_beneficiary,over_view_tv,sys_data)
Button(fr_tree_button, text="投保人",command=cb_overview_applicant_partial).grid(sticky=NW,padx=1,pady=1,row=0,column=0)
Button(fr_tree_button, text="被保人",command=cb_overview_insured_partial).grid(sticky=NW,padx=1,pady=1,row=0,column=1)
Button(fr_tree_button, text="受益人",command=cb_overview_beneficiary_partial).grid(sticky=NW,padx=1,pady=1,row=0,column=2)
#default for overview:applicant
cb_overview_applicant(over_view_tv,sys_data)
# ----vertical scrollbar----------
vbar = ttk.Scrollbar(fr_tree_list, orient=VERTICAL, command=over_view_tv.yview)
vbar.grid(sticky=NS,padx=1,pady=1,row=1,column=1)
over_view_tv.configure(yscrollcommand=vbar.set)
# ----horizontal scrollbar----------
hbar = ttk.Scrollbar(fr_tree_list, orient=HORIZONTAL, command=over_view_tv.xview)
hbar.grid(sticky=EW,padx=1,pady=1,row=100,column=0)
over_view_tv.configure(xscrollcommand=hbar.set)
#widgets for input policy.
policy_sample_info=Label(fr_input,text="策略模版:").grid(sticky="w",padx=1,pady=1,row=0,column=0)
policy_sample=Label(fr_input,text="policy sample.....", relief="sunken",width=120).grid(sticky="w",padx=10,pady=1,row=0,column=1)
Button(fr_input, text="复制策略").grid(sticky="w",padx=1,pady=1,row=0,column=2)
policy_input_info=Label(fr_input,text="输入策略:").grid(sticky="w",padx=1,pady=1,row=1,column=0)
policy_input=Entry(fr_input,text="policy sample.....", relief="sunken",width=120).grid(sticky="w",padx=10,pady=1,row=1,column=1)
Button(fr_input, text="执行查询").grid(sticky="w",padx=1,pady=1,row=1,column=2)
#widgets for main content table.
keys=list(docs[0].keys())
content_table = ttk.Treeview(master=fr_table, height=32,columns=keys)
content_table.grid(sticky=E,padx=1,pady=1,row=0,column=1)
main_table_fill(content_table,sys_data)
# ----horizontal scrollbar----------
ct_hbar = ttk.Scrollbar(master=fr_table, orient=HORIZONTAL, command=content_table.xview)
#ct_hbar.grid(sticky=EW,padx=1,pady=1,row=1,column=1)
content_table.configure(xscrollcommand=ct_hbar.set)
content_table.xview_moveto(0)
ct_hbar.grid(sticky=EW,padx=1,pady=1,row=1,column=1)
# ----vertical scrollbar----------
ct_vbar = ttk.Scrollbar(master=fr_table, orient=VERTICAL, command=content_table.yview)
ct_vbar.grid(sticky=NS,padx=1,pady=1,row=0,column=0)
content_table.configure(yscrollcommand=ct_vbar.set)
mainloop()