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

为何设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:42:43