使用columnspan后如何对齐Tkinter组件?
问题修复方案
问题根源在于第1行的ent_text_two跨了第1、2列,当它内容过长时会拉伸第2列的宽度,而label_two原本设置了sticky=tk.E,导致它在被拉长的第2列中右对齐,远离ent_text_one。
可以通过以下两步修复:
- 控制列的宽度分配:给第1列设置权重,让它承担窗口拉伸时的多余空间,第2列不设置权重,保持自身内容的宽度。
- 调整label_two的对齐方式:将
label_two的sticky改为tk.W,确保它始终靠左,紧贴ent_text_one。
修改后的完整代码如下:
import tkinter as tk from tkinter import ttk def main(): # Create the app's main window and loop root = tk.Tk() root.geometry('500x400') root.title('Test gui') mainframe = _create_main_frame(root) mainframe.grid(column=0, row=0) root.mainloop() def _create_main_frame(container): frame = ttk.Frame(container, padding=5) _create_gui_items(frame) return frame def _create_gui_items(frame): # 配置列权重:第1列可拉伸,第2列固定宽度 frame.grid_columnconfigure(1, weight=1) frame.grid_columnconfigure(2, weight=0) lbl_test_one = ttk.Label(frame, text='Label one') lbl_test_one.grid(row=0, column=0, sticky=tk.E) str_value_one = tk.StringVar() ent_text_one = ttk.Entry(frame, width=10, textvariable=str_value_one) ent_text_one.grid(row=0, column=1, sticky=tk.W) lbl_test_two = ttk.Label(frame, text='Label two') # 修改sticky为W,确保靠左对齐 lbl_test_two.grid(row=0, column=2, sticky=tk.W) lbl_test_three = ttk.Label(frame, text='Label three') lbl_test_three.grid(row=1, column=0, sticky=tk.W) str_value_two = tk.StringVar() ent_text_two = ttk.Entry(frame, width=25, textvariable=str_value_two) # 设置sticky=EW,让输入框在跨列范围内自适应拉伸 ent_text_two.grid(row=1, column=1, columnspan=2, sticky=tk.EW)
额外将ent_text_two的sticky改为tk.EW,可以让它在第1、2列的总宽度内自适应拉伸,避免强行拉宽第2列,进一步保证label_two的位置稳定。
内容的提问来源于stack exchange,提问作者Psionman
相关产品推荐
相关产品推荐

