黄河边 2025-02-22 16:05 采纳率: 25%
浏览 18

tkinter treeview表格调整列宽以后水平滚动条失效

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

右侧表格,调整列宽以前滚动条正常

img

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

img

代码如下:

#
#保险单管理程序主界面,界面组件定义和交互处理。
#

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

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-02-22 16:06
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解决方案

    Tkinter Treeview 表格调整列宽以后水平滚动条失效的原因是 Treeview 的 scrollregion 属性没有被更新。

    在调整列宽后,Treeview 的 scrollregion 属性需要被更新,以便滚动条能够正确地显示。可以使用 treeview.configure(scrollregion=treeview.bbox("all")) 方法来更新 scrollregion 属性。

    例如:

    import tkinter as tk
    from tkinter import ttk
    
    root = tk.Tk()
    tree = ttk.Treeview(root)
    
    # ...其他代码...
    
    # 调整列宽
    tree.column("#0", width=100)
    tree.column("column1", width=200)
    tree.column("column2", width=300)
    
    # 更新 scrollregion 属性
    tree.configure(scrollregion=tree.bbox("all"))
    
    root.mainloop()
    

    在上面的代码中,我们首先调整了 Treeview 的列宽,然后使用 tree.configure(scrollregion=tree.bbox("all")) 方法更新 scrollregion 属性。这样,水平滚动条就能够正确地显示了。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月22日