鱼C论坛

 找回密码
 立即注册
查看: 1360|回复: 14

[已解决]Tkinter b . pack ( fill = "y" )

[复制链接]
发表于 2023-7-28 20:33:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. from tkinter import *
  2. root=Tk()
  3. root.geometry("444x333")
  4. b=Button(root,text="杜苏芮",background="fuchsia")
  5. b.pack(fill="y")
  6. mainloop()
复制代码


为什么不能得到如下的图形 ?

b.pack(fill="y") 为什么不能起作用 ?
最佳答案
2023-7-29 10:28:18
dragov 发表于 2023-7-29 10:15
看了大家的回复,有些迷茫,为什么 pack(fill="x") 能起作用;而 pack(fill="y") 不能起作用,而必须改为 ...

我的回答有没有解决你的问题?
579.png

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-28 20:34:06 | 显示全部楼层
根据您提供的代码,b.pack(fill="y") 指定了按钮 b 在垂直(y)方向上填充其可用空间。然而,由于没有其他组件或内容在窗口中占据空间,这种填充效果可能不会明显。

在您提供的代码中,窗口的大小为 "444x333",并且按钮 b 的文本为 "杜苏芮",背景颜色为 "fuchsia"。当您运行该代码时,您应该能够看到一个具有指定大小和颜色的按钮 b 嵌入在窗口中。

如果您希望填充有关的更多细节,例如将多个组件放置在窗口中,并使用 pack() 方法进行布局,请提供更详细的要求和期望,我将尽力提供更准确的帮助。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 20:34:10 | 显示全部楼层
在这段代码中, b.pack(fill="y")  无法起作用的原因是, fill  参数只对容器(如 Frame)中的组件进行填充,对于 Button 这样的组件来说, fill  参数并不起作用。

pack  方法是用于管理和显示组件的几何布局管理器。它负责在容器中摆放组件,并根据指定的选项进行布局。

在这里,您创建了一个名为  b  的 Button 组件,并在其上设置了  fill="y" ,希望该按钮在容器中垂直填充。然而,Button 组件并不接受  fill  参数,因此该选项不会影响按钮的显示。

如果您想要在垂直方向上填充组件,您可以考虑使用其他组件(例如 Frame)来实现该效果。这是因为  fill  参数对于容器来说是有效的,可以控制容器中的组件如何填充容器的可用空间。

以下是一个修改后的代码示例,用 Frame 来实现垂直填充效果:

  1. from tkinter import *

  2. root = Tk()
  3. root.geometry("444x333")

  4. frame = Frame(root)
  5. frame.pack(fill="y")

  6. b = Button(frame, text="杜苏芮", background="fuchsia")
  7. b.pack(fill="y")

  8. mainloop()
复制代码


在这个修改后的代码中,我们创建了一个 Frame 组件作为容器,并将 Button 放置在这个 Frame 中。然后,我们对 Frame 使用  fill="y" ,使得 Frame 在垂直方向上填充整个可用空间。这样就实现了类似垂直填充的效果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 20:34:16 | 显示全部楼层
在你提供的代码中,b.pack(fill="y") 是用来设置按钮 b 在垂直方向上填充整个可用空间。然而,由于你的窗口 root 的大小只是 "444x333",并且没有其他组件占据垂直空间,所以无法看到按钮在垂直方向上的填充效果。

如果你想要看到 b.pack(fill="y") 的效果,可以根据需要扩大窗口的高度或者在窗口中添加其他组件来占据垂直空间。例如,你可以尝试将窗口大小改为 "444x600",或者在按钮下方添加一个 Frame 组件来占据一部分垂直空间,让按钮的填充效果更加明显。

另外,需要注意的是,使用 fill="y" 仅在有额外可用空间时才会生效。如果窗口已经填满了可用空间,即使设置了 fill="y",按钮也不会继续增长。

希望这个解答对你有所帮助!如有任何进一步的问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-28 20:43:22 | 显示全部楼层


想得到如图的效果,就必须改为  b.pack(fill="y",expand=True)
为什么必须添加 expand=True ?


  1. from tkinter import *
  2. root=Tk()
  3. root.geometry("444x333")
  4. b=Button(root,text="杜苏芮",background="fuchsia")
  5. b.pack(fill="y",expand=1)
  6. mainloop()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-28 20:45:18 | 显示全部楼层
"expand=True" 在 tkinter 窗口的 pack 布局管理器中起到了一个很重要的作用。

它决定了当父窗口的大小改变时,部件是否会增大。如果 expand=True,那么部件就会填充他的父部件在x和y方向上的额外空间。如果 expand=False(默认值),那么部件将保持它的原始尺寸,而不会扩展到父部件未使用的空间。

在你这个例子中,假设我们将 expand 设置为 False ,那么当我们尝试更改窗口的大小时,"Button" 控件就会保持原来的大小,并且不会去填充变大的窗口空间,也就不会得到预期的效果。而设置了 expand=True,按钮就会自动填充窗口的其他空间,使得按钮始终覆盖整个窗口高度,得到了和图描述一样的效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 20:46:44 | 显示全部楼层
本帖最后由 liuhongrun2022 于 2023-7-28 20:49 编辑
dragov 发表于 2023-7-28 20:43
想得到如图的效果,就必须改为  b.pack(fill="y",expand=True)
为什么必须添加 expand=True ?


expand=True 的意思是如果有空白,就填满
因为 fill=X 是有剩余位置的,就自动填满了

评分

参与人数 1荣誉 +2 贡献 +1 收起 理由
python爱好者. + 2 + 1 正解

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 20:51:39 | 显示全部楼层
本帖最后由 hellomyprogram 于 2023-7-28 20:53 编辑

因为摆在中间的组件默认的边界范围是在那一行,而要想做到将那一列填满,你需要将这个默认的边界范围扩大到整个界面。
类似于下图:
没有expand类似于下图:
左上右上
中心
左下右下

其中橙色的是边界范围之外,蓝色为边界范围之内,绿色是显示的区域。这时候添加fill="y"没有作用,因为边界范围之内就只有那么高。

而如果有了expand就是这样了:
左上右上
中心
左下右下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-29 08:43:27 | 显示全部楼层
如果答案对你有帮助,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-29 10:15:03 | 显示全部楼层
liuhongrun2022 发表于 2023-7-29 08:43
如果答案对你有帮助,请设置最佳答案

看了大家的回复,有些迷茫,为什么 pack(fill="x") 能起作用;而 pack(fill="y") 不能起作用,而必须改为pack(fill="y",expand=True) 才能起作用!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-29 10:24:21 | 显示全部楼层
本帖最后由 liuhongrun2022 于 2023-7-29 10:26 编辑
dragov 发表于 2023-7-29 10:15
看了大家的回复,有些迷茫,为什么 pack(fill="x") 能起作用;而 pack(fill="y") 不能起作用,而必须改为 ...


因为 fill=X 会默认填充,fill=Y 不会默认填充,需要加上 expand=True 来填充
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 10:28:18 | 显示全部楼层    本楼为最佳答案   
dragov 发表于 2023-7-29 10:15
看了大家的回复,有些迷茫,为什么 pack(fill="x") 能起作用;而 pack(fill="y") 不能起作用,而必须改为 ...

我的回答有没有解决你的问题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-29 10:31:42 | 显示全部楼层
liuhongrun2022 发表于 2023-7-29 10:24
因为 fill=X 会默认填充,fill=Y 不会默认填充,需要加上 expand=True 来填充


pack(fill="both") 也不能起作用的,也需要改为pack(fill="both" , expand=True) 才能起作用,真的迷茫啊 ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 10:57:14 | 显示全部楼层
本帖最后由 liuhongrun2022 于 2023-7-29 11:01 编辑
dragov 发表于 2023-7-29 10:31
pack(fill="both") 也不能起作用的,也需要改为pack(fill="both" , expand=True) 才能起作用,真的迷茫 ...


来自小甲鱼:
其中,fill 选项是告诉窗口管理器该组件将填充整个分配给它的空间,BOTH 表示同时横向和纵向扩展,X 表示横向,Y 表示纵向;expand 选项是告诉窗口管理器将父组件的额外空间也填满。

默认下,pack 是将添加的组件依次纵向排列:

                               
登录/注册后可看大图

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 11:00:54 | 显示全部楼层
dragov 发表于 2023-7-29 10:31
pack(fill="both") 也不能起作用的,也需要改为pack(fill="both" , expand=True) 才能起作用,真的迷茫 ...

也就是说,只有fill=X会默认填充,剩下的fill=Y和fill=BOTH需要手动设置expand=True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 16:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表