如何让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
相关产品推荐
相关产品推荐

