Tkinter中如何实现多个不同列数的Treeview控件左对齐
Tkinter多Treeview左对齐问题解决方案
问题背景
开发目标为基于列数互不相同的多个DataFrame创建对应Treeview控件,每个Treeview放置在独立Frame中,所有子Frame统一收纳在主Frame内。现有代码已完成绝大多数功能,仅列数较少的小规模DataFrame对应的Treeview无法靠左对齐,呈现居中显示效果;尝试调整pack方法的side参数为left、top、bottom等取值,均未实现所有Treeview左对齐的效果。
原有实现代码如下:
import numpy as np import pandas as pd import string import tkinter as tk from tkinter import ttk string.ascii_lowercase n = 5 m = 25 cols11 = string.ascii_lowercase[:m] df = pd.DataFrame(np.random.randint(0, n,size=(n , m)), columns=list(cols11)) a = 5 b = 15 cols12 = string.ascii_lowercase[:b] df1 = pd.DataFrame(np.random.randint(0, a,size=(a , b)), columns=list(cols12)) c = 5 d= 10 cols22 = string.ascii_lowercase[:d] df2 = pd.DataFrame(np.random.randint(0, c,size=(c , d)), columns=list(cols22)) e = 5 f= 5 cols32 = string.ascii_lowercase[:f] df3= pd.DataFrame(np.random.randint(0, e,size=(e , f)), columns=list(cols32)) cols = list(df.columns) cols1 = list(df1.columns) cols2 = list(df2.columns) cols3 = list(df3.columns) root1 = tk.Tk() main_frame=tk.Frame(root1) main_frame.pack(fill=tk.BOTH,expand=1) my_canvas=tk.Canvas(main_frame) my_canvas.pack(side=tk.LEFT,fill=tk.BOTH,expand=1) my_scrollbary=tk.Scrollbar(main_frame,orient=tk.VERTICAL,command=my_canvas.yview) my_scrollbary.pack(side=tk.RIGHT,fill=tk.Y) my_scrollbarx=tk.Scrollbar(root1,orient=tk.HORIZONTAL,command=my_canvas.xview) my_scrollbarx.pack(side=tk.BOTTOM,fill=tk.X) my_canvas.configure(yscrollcommand=my_scrollbary.set, xscrollcommand=my_scrollbarx.set) my_canvas.bind('<Configure>', lambda e:my_canvas.configure(scrollregion=my_canvas.bbox("all"))) root=tk.Frame(my_canvas) my_canvas.create_window((0,0),window=root,anchor="nw") frame1=tk.Frame(root) frame1.pack(anchor='w') tree = ttk.Treeview(frame1) tree.pack() tree["columns"] = cols for i in cols: tree.column(i, anchor="w") tree.heading(i, text=i, anchor='w') for index, row in df.iterrows(): tree.insert("",0,text=index,values=list(row)) frame2=tk.Frame(root) frame2.pack(anchor='w') tree1 = ttk.Treeview(frame2) tree1.pack() tree1["columns"] = cols1 for i in cols1: tree1.column(i, anchor="w") tree1.heading(i, text=i, anchor='w') for index, row in df1.iterrows(): tree1.insert("",0,text=index,values=list(row)) frame3=tk.Frame(root) frame3.pack(anchor='w') tree2 = ttk.Treeview(frame3) tree2.pack() tree2["columns"] = cols2 for i in cols2: tree2.column(i, anchor="w") tree2.heading(i, text=i, anchor='w') for index, row in df2.iterrows(): tree2.insert("",0,text=index,values=list(row)) # frame4=tk.Frame(root) frame4.pack(anchor='w') tree3 = ttk.Treeview(frame4) tree3.pack() tree3["columns"] = cols3 for i in cols3: tree3.column(i, anchor="w") tree3.heading(i, text=i, anchor='w') for index, row in df3.iterrows(): tree3.insert("",0,text=index,values=list(row)) root.mainloop()
问题原因
代码中仅给承载Treeview的子Frame设置了anchor='w'实现Frame本身在父容器内左对齐,但Treeview控件在所属子Frame内调用pack()时未指定对齐参数,默认居中对齐;由于子Frame宽度会匹配最宽的Treeview宽度,列数更少、宽度更窄的Treeview就会在Frame内居中显示,视觉上呈现没有靠左对齐的效果。
修复方法
将所有Treeview的pack调用补充anchor='w'参数,强制Treeview在所属父Frame内靠左停靠,需要修改的4处代码如下:
- 原
tree.pack()修改为tree.pack(anchor='w') - 原
tree1.pack()修改为tree1.pack(anchor='w') - 原
tree2.pack()修改为tree2.pack(anchor='w') - 原
tree3.pack()修改为tree3.pack(anchor='w')
修改后所有Treeview均可正常实现左对齐效果。
内容的提问来源于stack exchange,提问作者Orlando
相关产品推荐
相关产品推荐

