You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让tkinter的ttk.Treeview加载SQLite表时保持固定宽度

问题原因

ttk.Treeview默认开启了列自动拉伸属性,且你没有限制Treeview所在容器的布局拉伸规则,导致每次加载新列时Treeview会随内容自动调整整体宽度。

解决方案

修改点1:调整布局规则,固定Treeview整体宽度

在main函数中补充布局权重配置,限制Treeview的最大可用宽度:

def main():
    global table, window

    window = tk.Tk()
    window.title('Sql Queries Gui')
    window.geometry('800x650')
    window.attributes('-topmost', 1)
    # 新增:窗口列0随窗口缩放,固定home_frame的宽度适配窗口
    window.columnconfigure(0, weight=1)

    home_frame = tk.Frame(window, bg="#e0f8f2")
    home_frame.grid(row=0, column=0, sticky=tk.EW)
    # 新增:home_frame列0占满可用宽度,Treeview不会超出该宽度
    home_frame.columnconfigure(0, weight=1)

    # 其余原有代码不变...

    # 创建Treeview时指定固定宽度,匹配布局可用宽度
    table = ttk.Treeview(home_frame, show="headings", height=20, selectmode=tk.BROWSE, width=750)
    table.grid(column=0, row=2, sticky=tk.EW)

修改点2:关闭列自动拉伸属性,固定列宽

修改call_back_func中的列配置逻辑,删除原有的无效宽度设置代码:

def call_back_func(event):
    selected_table = event.widget.get()
    handler = db.SqlLiteHandler.get_instance()
    cols_name = handler.get_columns_for(selected_table)
    all_data = handler.get_data_from_table(selected_table, columns_names=cols_name)

    # 清空原有内容
    table.delete(*table.get_children())
    table['columns'] = cols_name

    # 新增:列宽配置,总宽和Treeview宽度匹配即可,也可自定义每列宽度
    total_available_width = 750
    per_col_width = total_available_width // len(cols_name) if cols_name else 0
    for col in cols_name:
        table.heading(col, text=col.title())
        # 核心参数stretch=False:禁止列自动拉伸
        table.column(col, width=per_col_width, anchor=tk.W, stretch=False)

    # 插入数据逻辑不变
    for i, item in enumerate(all_data):
        table.insert('', tk.END, iid=i, values=item)

可选配置:列宽自适应内容+固定Treeview宽度

如果不需要列等分,希望列宽适配内容同时保持Treeview整体宽度不变,可将列配置部分替换为如下逻辑:

from tkinter import font
# 计算内容最大宽度
font_config = font.Font()
for col in cols_name:
    # 计算表头宽度
    header_width = font_config.measure(col.title())
    # 计算该列所有内容的最大宽度
    content_width = max(font_config.measure(str(row[cols_name.index(col)])) for row in all_data) if all_data else 0
    col_width = max(header_width, content_width) + 10 # 加10px边距
    table.heading(col, text=col.title())
    table.column(col, width=col_width, anchor=tk.W, stretch=False)

该方案下超出Treeview宽度的内容可通过横向滚动条查看,Treeview整体宽度始终保持固定。


内容的提问来源于stack exchange,提问作者SagiZiv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:45:03