如何在CustomTkinter中实现组件垂直居中对齐?
CustomTkinter 实现Frame内组件垂直居中
针对全屏时Frame内组件仅水平居中、垂直靠上的问题,这里提供两种无需硬编码位置的解决方案,同时保留原有组件属性:
方案一:新增子Frame包裹组件(推荐,无需修改原有组件布局)
通过创建透明子Frame包裹所有需要居中的组件,再让子Frame在父Frame中自动居中,完全保留原有组件的pack参数和样式:
import customtkinter customtkinter.set_appearance_mode("dark") customtkinter.set_default_color_theme("blue") app = customtkinter.CTk() app.geometry("400x780") app.title("CustomTkinter simple_example.py") frame_1 = customtkinter.CTkFrame(master=app) frame_1.pack(pady=20, padx=60, fill="both", expand=True) # 新增透明子Frame,包裹所有需要居中的组件 inner_frame = customtkinter.CTkFrame(master=frame_1, fg_color="transparent") inner_frame.pack(expand=True) # 自动占据父Frame可用空间,默认水平+垂直居中 label_1 = customtkinter.CTkLabel(master=inner_frame, justify=customtkinter.LEFT) label_1.pack(pady=10, padx=10) button_1 = customtkinter.CTkButton(master=inner_frame) button_1.pack(pady=10, padx=10) entry_1 = customtkinter.CTkEntry(master=inner_frame, placeholder_text="CTkEntry") entry_1.pack(pady=10, padx=10) checkbox_1 = customtkinter.CTkCheckBox(master=inner_frame) checkbox_1.pack(pady=10, padx=10) radiobutton_var = customtkinter.IntVar(value=1) radiobutton_1 = customtkinter.CTkRadioButton(master=inner_frame, variable=radiobutton_var, value=1) radiobutton_1.pack(pady=10, padx=10) radiobutton_2 = customtkinter.CTkRadioButton(master=inner_frame, variable=radiobutton_var, value=2) radiobutton_2.pack(pady=10, padx=10) app.mainloop()
说明:
inner_frame设置fg_color="transparent",避免新增视觉边框,保持原有UI风格inner_frame.pack(expand=True):父Frame随窗口扩展时,子Frame自动填充可用空间,默认对齐方式为水平+垂直居中,实现内部组件整体居中- 原有组件的
pady、padx等属性完全保留,无需修改
方案二:使用Grid布局实现父Frame内居中
如果不想新增子Frame,可将父Frame布局改为Grid,通过配置行列权重让组件所在单元格居中:
import customtkinter customtkinter.set_appearance_mode("dark") customtkinter.set_default_color_theme("blue") app = customtkinter.CTk() app.geometry("400x780") app.title("CustomTkinter simple_example.py") frame_1 = customtkinter.CTkFrame(master=app) frame_1.pack(pady=20, padx=60, fill="both", expand=True) # 配置父Frame行列权重,让第0行0列占据所有可用空间 frame_1.grid_rowconfigure(0, weight=1) frame_1.grid_columnconfigure(0, weight=1) label_1 = customtkinter.CTkLabel(master=frame_1, justify=customtkinter.LEFT) label_1.grid(row=0, column=0, pady=10, padx=10, sticky="n") # sticky="n"保持垂直排列 button_1 = customtkinter.CTkButton(master=frame_1) button_1.grid(row=1, column=0, pady=10, padx=10, sticky="n") entry_1 = customtkinter.CTkEntry(master=frame_1, placeholder_text="CTkEntry") entry_1.grid(row=2, column=0, pady=10, padx=10, sticky="n") checkbox_1 = customtkinter.CTkCheckBox(master=frame_1) checkbox_1.grid(row=3, column=0, pady=10, padx=10, sticky="n") radiobutton_var = customtkinter.IntVar(value=1) radiobutton_1 = customtkinter.CTkRadioButton(master=frame_1, variable=radiobutton_var, value=1) radiobutton_1.grid(row=4, column=0, pady=10, padx=10, sticky="n") radiobutton_2 = customtkinter.CTkRadioButton(master=frame_1, variable=radiobutton_var, value=2) radiobutton_2.grid(row=5, column=0, pady=10, padx=10, sticky="n") app.mainloop()
说明:
frame_1.grid_rowconfigure(0, weight=1)和grid_columnconfigure(0, weight=1)让第0行第0列占据父Frame的所有可用空间- 每个组件的
sticky="n"保证组件在单元格内顶部对齐,保持原有垂直排列样式,同时单元格整体在父Frame中垂直+水平居中
内容的提问来源于stack exchange,提问作者Rithvik Ravikumar
相关产品推荐
相关产品推荐

