如何在CustomTkinter弹窗中动态排列80个复选框?
解决CustomTkinter弹窗中复选框的网格布局问题
直接给你修改后的完整实现代码,同时拆解关键逻辑:
def open_secondary_window(self): # 创建弹窗窗口 secondary_window = customtkinter.CTkToplevel() secondary_window.geometry("800x300") # 调整窗口大小适配80个复选框 secondary_window.title("Object Selection") # 创建滚动框架,容纳所有复选框(避免内容超出窗口) scroll_frame = customtkinter.CTkScrollableFrame(secondary_window) scroll_frame.pack(fill="both", expand=True, padx=10, pady=10) # 动态生成复选框,每10个换一列 items_per_column = 10 for i, class_name in enumerate(class_names): # 计算当前复选框的行和列:行号取模循环,列号整除递增 row = i % items_per_column column = i // items_per_column # 创建复选框并布局到网格 checkbox = customtkinter.CTkCheckBox(scroll_frame, text=class_name) checkbox.grid(row=row, column=column, padx=15, pady=5, sticky="w") # 创建关闭按钮,放在窗口底部居中 button_close = customtkinter.CTkButton( secondary_window, text="Close window", command=secondary_window.destroy ) button_close.pack(pady=10)
关键逻辑说明
- 网格布局核心
用i % 10得到当前列的行号(0-9循环),i // 10得到列号(每10个自动加1),完美实现「每10个复选框切换到下一列并从第0行开始」的需求。 - 滚动容器适配
80个复选框会超出固定窗口大小,用CTkScrollableFrame包裹所有复选框,内容超出时自动生成滚动条,避免布局挤压或内容丢失。 - 布局优化
- 调整窗口初始大小为
800x300,适配多列布局 - 关闭按钮用
pack放在底部居中,替代固定坐标的place,适配窗口大小变化 - 给复选框添加
padx和pady间距,提升可读性
- 调整窗口初始大小为
内容的提问来源于stack exchange,提问作者Captain C
相关产品推荐
相关产品推荐

