CustomTkinter新手求助:grid循环放置Frame时第二列最后一个缺失
问题解决:CustomTkinter循环grid放置Frame时第二列最后一个缺失
问题原因
你遇到的问题主要有两个可能:
- 布局逻辑误解:你的代码是按列排列Frame(每列5个),如果你的预期是日历常用的行排列(每行7个),会导致对“第二列”的显示预期错误。
- grid布局未配置扩展:原代码固定了Frame的宽高,但没有设置单元格的自动扩展规则,窗口空间不足时部分Frame会被截断或隐藏。
修复方案
方案1:改为日历常用的行排列(推荐)
如果目标是实现日历布局(每行7天),调整循环中的行列判断逻辑:
import customtkinter as ctk WIDTH, HEIGHT = 1000, 600 ctk.set_appearance_mode("dark") ctk.set_default_color_theme("green") win = ctk.CTk() win.geometry(f"{WIDTH}x{HEIGHT}") win.title("日历") frame = ctk.CTkFrame(win) frame.pack(expand=True, fill="both", padx=5, pady=5) # 配置单元格自动扩展,让Frame自适应窗口大小 for col in range(7): frame.columnconfigure(col, weight=1) for row in range(5): frame.rowconfigure(row, weight=1) frames = [] for day in range(31): frames.append(ctk.CTkFrame(frame, corner_radius=5)) rowx, columny = 0, 0 for f in frames: # 设置sticky让Frame填充整个单元格 f.grid(row=rowx, column=columny, padx=1, pady=1, sticky="nsew") # 每行7个,列数到6时换行 if columny == 6: columny = 0 rowx += 1 else: columny += 1 win.mainloop()
方案2:保留列排列逻辑,修复显示问题
如果确实需要按列排列(每列5个),添加单元格扩展配置:
import customtkinter as ctk WIDTH, HEIGHT = 1000, 600 ctk.set_appearance_mode("dark") ctk.set_default_color_theme("green") win = ctk.CTk() win.geometry(f"{WIDTH}x{HEIGHT}") win.title("按列排列") frame = ctk.CTkFrame(win) frame.pack(expand=True, fill="both", padx=5, pady=5) # 配置7列和5行的单元格自动扩展 for col in range(7): frame.columnconfigure(col, weight=1) for row in range(5): frame.rowconfigure(row, weight=1) frames = [] for day in range(31): frames.append(ctk.CTkFrame(frame, corner_radius=5)) rowx, columny = 0, 0 for f in frames: f.grid(row=rowx, column=columny, padx=1, pady=1, sticky="nsew") if rowx == 4: rowx = 0 columny += 1 else: rowx += 1 win.mainloop()
关键修改点
- 移除Frame的固定宽高,改为让单元格控制大小。
- 添加
columnconfigure和rowconfigure配置,设置weight=1让单元格随窗口自动扩展。 - 给
grid添加sticky="nsew",让Frame填充整个单元格。
内容的提问来源于stack exchange,提问作者Christopher Munoz
相关产品推荐
相关产品推荐

