
使用 customtkinter 创建带 frame 的 gui 时,若窗口空白,通常是因为未对 frame 调用布局管理器(pack/grid/place),导致其虽已实例化却未被渲染到主窗口中。
使用 customtkinter 创建带 frame 的 gui 时,若窗口空白,通常是因为未对 frame 调用布局管理器(pack/grid/place),导致其虽已实例化却未被渲染到主窗口中。
在基于类的 CustomTkinter 应用中,正确组织 UI 组件的关键在于:所有子部件(包括自定义 Frame)必须显式调用布局方法,并确保其父容器已正确关联和展示。
回顾原始代码,问题核心有两点:
- self.menu = CTkFrame(self) 创建了 Frame 实例,但未调用 pack()、grid() 或 place() → 导致该 Frame 完全不可见;
- 内部嵌套的 Menu 类虽已定义,却未被实际实例化使用 → 当前 self.menu 是一个普通 CTkFrame,而非你自定义的 Menu 类实例。
✅ 正确做法如下:
- 将 self.menu 替换为 self.Menu(self) 实例,使其真正使用你封装好的菜单逻辑;
- 在主窗口中为该 Menu 实例调用 pack()(或 grid()/place())完成布局;
- 同时注意:CTkComboBox 的参数名应为 values=(非 value=),这是 CustomTkinter 的标准 API。
以下是修复后的完整可运行代码:
from customtkinter import *
from tkinter import StringVar
class App(CTk):
def __init__(self, title, size):
super().__init__()
self.title(title)
self.geometry(f'{size[0]}x{size[1]}')
self.minsize(size[0], size[1])
# ✅ 正确实例化自定义 Menu 类,并立即布局
self.menu = self.Menu(self)
self.menu.pack(fill="both", expand=True) # 推荐使用 fill+expand 适配窗口
self.mainloop()
class Menu(CTkFrame):
def __init__(self, parent):
super().__init__(parent)
# ⚠️ 注意:place() 会脱离主布局体系,慎用于复杂嵌套
# 此处若需固定左侧 30% 宽度,建议改用 grid + columnconfigure 或 pack(side='left')
self.place(x=0, y=0, relwidth=0.3, relheight=1)
self.create_widgets()
def create_widgets(self):
heading_var = StringVar(value="Ethan")
def heading_combo(choice):
print("Selected:", choice)
# ✅ 修正参数名:values= (不是 value=)
heading = CTkComboBox(
self,
values=["Ethan", "Brock", "Liam"],
command=heading_combo,
variable=heading_var
)
heading.pack(pady=20)
# 建议:column/rowconfigure 对 place 布局无效,仅对 grid 生效
# 若后续改用 grid,请取消注释并配合 .grid()
# self.grid_columnconfigure((0,1,2), weight=1, uniform='a')
# self.grid_rowconfigure((0,1,2,3,4), weight=1, uniform='a')
App('Scoring Software', (600, 600))? 关键注意事项:
- 布局管理器不可省略:CTkFrame 及其子组件必须通过 pack()、grid() 或 place() 显式布局,否则不会显示;
- 避免混用布局器:同一父容器内不要同时使用 pack() 和 grid();place() 独立于其他两种,适合绝对定位,但不利于响应式设计;
- 类命名规范:Python 类名推荐 PascalCase(如 App、Menu),而非小写 app,提升可读性与兼容性;
- 自定义子类需主动实例化:定义 class Menu(CTkFrame) 并不自动替换任何行为,必须显式调用 self.Menu(parent) 才能生效。
掌握这些原则后,你就能稳定构建结构清晰、可维护性强的 CustomTkinter GUI 应用了。

















