如何在 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
中的所有小部件,然后我将小部件的创建分组在一起,然后将小部件的布局在一起。还要注意top
和text2
被打包的顺序。
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)
我的应用程序底部有这个文本框,无论如何我都需要它留在那里(很像 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
中的所有小部件,然后我将小部件的创建分组在一起,然后将小部件的布局在一起。还要注意top
和text2
被打包的顺序。
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)