为何设置expand=False后Tkinter Frame仍自动扩展?
问题解决:CTkFrame的expand属性未生效的处理方案
先拆解你代码里的核心问题:
- 你给
category_9_product_frame设置了width=100,但Frame默认会根据子组件自动调整大小(这个行为叫组件传播),所以你的width设置直接被忽略,产品按钮会直接撑开这个Frame。 - 你用
pack(side='left')时虽默认是expand=False,但结合父容器的布局逻辑,需要调整配套参数才能达到预期效果。
下面是修改后的代码,针对性解决问题:
root = ctk.CTk() root.geometry('1440x810') root._set_scaling(1,1) root.resizable(False, False) left_img = ctk.CTkImage(Image.open('assets/promotion_left.png'), size = (20,40)) right_img = ctk.CTkImage(Image.open('assets/promotion_right.png'), size = (20,40)) category_row_3 = ctk.CTkFrame(root, fg_color = 'white', corner_radius = 0, border_width = 0) category_row_3.pack(side = 'top', fill = 'x', expand = True, padx = 15) category_9_info = ctk.CTkFrame(category_row_3, fg_color = 'transparent', corner_radius = 0, border_width = 0) category_9_info.pack(side = 'top', fill = 'x') category_9 = ctk.CTkFrame(category_row_3, fg_color = 'transparent', corner_radius = 0, border_width = 0) category_9.pack(side = 'top', fill = 'both', expand = True) category_9_left_button = ctk.CTkButton(category_9, text = '', image = left_img, fg_color = 'transparent', hover_color = '#f2f2f2') category_9_left_button.pack(side = 'left', fill = 'y', ipadx = 5) category_9_product_frame = ctk.CTkFrame(category_9, fg_color = 'transparent', corner_radius = 0, border_width = 0, width = 100) # 关键修改1:禁止组件传播,强制Frame保持你设置的width category_9_product_frame.pack_propagate(False) # 关键修改2:明确设置expand=False,同时让高度填满父容器 category_9_product_frame.pack(side = 'left', fill='y', expand=False) category_9_products = [1,2,3,4] test = ctk.CTkImage(Image.open('assets/search_icon.png'), size = (200,200)) for product in category_9_products: ctk.CTkButton(category_9_product_frame, text = '', image = test).pack(side = 'left') category_9_right_button = ctk.CTkButton(category_9, text = '', image = right_img, fg_color = 'transparent', hover_color = '#f2f2f2') category_9_right_button.pack(side = 'right', fill = 'y', ipadx = 5) root.mainloop()
额外补充:
- 如果产品按钮总宽度超过
category_9_product_frame的设置宽度,按钮会被裁剪,这时候可以给该Frame添加横向滚动条,或者调整按钮尺寸、显示数量。 - 如果你不需要固定产品Frame的宽度,只想让它仅占用自身所需空间、不抢占左右按钮的布局,只需去掉
width=100和pack_propagate(False),保留pack(side='left', expand=False)即可。
内容的提问来源于stack exchange,提问作者Toby
相关产品推荐
相关产品推荐

