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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:05:00