如何在 resizing/shrinking tkinter 应用程序 window 时保持小部件可见

How to keep a widget visible while resizing/shrinking the tkinter app window

我的应用程序底部有这个文本框,无论如何我都需要它留在那里(很像 css 中的粘性定位)。但是当我调整 window 的大小时,文本框有点被顶部的框架隐藏(由另一个文本框和一个滚动条组成)

top=Frame(self.root)
top.pack(side=TOP, fill=BOTH, expand=True)
text1=Text(top)
text1.pack(side=LEFT, fill=BOTH, expand=True)
scroll=Scrollbar(top)
scroll.pack(side=RIGHT, fill=Y)
scroll.config(command=text1.yview)
text1.config(yscrollcommand=scroll.set)
text1.config(state="disabled")
text2=Text(self.root, height=1)
text2.pack(side=BOTTOM, fill=BOTH, expand=False)
self.root.mainloop()

当您调整 window 的大小以使其小于首选大小时,tkinter 别无选择,只能开始减小内部小部件的大小。由于您使用的是 pack,因此 pack 将从减小最后打包的小部件的大小开始。一旦它消失,它将选择 next-to-last 小部件,依此类推。

在你的例子中,底部的文本小部件是最后打包的,所以它是第一个被减少的。在你的情况下,你希望顶部的文本小部件是增长和收缩的那个,所以它应该是你最后打包的那个。

就我个人而言,如果将具有相同父级或母版的小部件分组在一起,并将布局命令与小部件创建命令分开,我会发现代码更容易阅读。它使可视化小部件之间的关系变得更加容易。在你的情况下,我会重写代码如下所示。

请注意,我首先创建直接位于根目录中的所有小部件,然后是 top 中的所有小部件,然后我将小部件的创建分组在一起,然后将小部件的布局在一起。还要注意toptext2被打包的顺序。

    top=Frame(self.root)
    text2=Text(self.root, height=1, background="pink")

    text2.pack(side=BOTTOM, fill=BOTH, expand=False)
    top.pack(side=TOP, fill=BOTH, expand=True)

    text1=Text(top)
    scroll=Scrollbar(top)
    text1.config(yscrollcommand=scroll.set)
    text1.config(state="disabled")
    scroll.config(command=text1.yview)

    text1.pack(side=LEFT, fill=BOTH, expand=True)
    scroll.pack(side=RIGHT, fill=Y)

注:

管理小部件的顺序称为装箱单。更改装箱单的正常方法是以不同的顺序包装项目,如上例所示。但是,您可以明确请求以不同的顺序放置项目。例如,您可以先继续打包 top 小部件,但是当您打包 text2 时,您可以使用 before=top 告诉 pack 您希望底部文本小部件在装箱单中的顶级小部件之前。

    top.pack(side=TOP, fill=BOTH, expand=True)
    text2.pack(side=BOTTOM, fill=BOTH, expand=False, before=top)