当窗口宽度超出阈值时垂直滚动条消失
这段代码创建了一个窗口,里面有一个文本框和一个垂直滚动条。如果你通过拖动窗口的边缘来改变窗口的宽度,当宽度变得小于某个值(大约660像素)时,垂直滚动条就会消失。
那么,是什么原因导致当宽度达到这个值时,垂直滚动条被挤出窗口呢?我并没有为任何组件设置宽度。我本以为文本框会随着窗口宽度的减小而变得越来越小。
import tkinter
window = tkinter.Tk()
text_box = tkinter.Text(master = window)
text_box.pack(side = "left", fill = "both", expand = True)
vertical_scrollbar = tkinter.Scrollbar(master = window, command = text_box.yview)
vertical_scrollbar.pack(side = "right", fill = "y")
window.mainloop()
2 个回答
0
这是因为 pack
方法会把所有的控件(小部件)放在一起,并试图为它们分配空间。当你的窗口宽度变成一个具体的数字时,滚动条就可能不在窗口的可见区域内了。
使用 grid
方法和你的控件,可以确保它们一直可见:
import tkinter
window = tkinter.Tk()
text_box = tkinter.Text(master=window)
text_box.grid(row=0, column=0, sticky="nsew")
vertical_scrollbar = tkinter.Scrollbar(master=window, command=text_box.yview)
vertical_scrollbar.grid(row=0, column=1, sticky="ns")
text_box.configure(yscrollcommand=vertical_scrollbar.set)
window.grid_rowconfigure(0, weight=1)
window.grid_columnconfigure(0, weight=1)
window.mainloop()
更新:
根据 @jasonharper 的评论,先把滚动条放进去可以让它保持可见:
import tkinter
window = tkinter.Tk()
vertical_scrollbar = tkinter.Scrollbar(master = window)
vertical_scrollbar.pack(side = "right", fill = "y")
text_box = tkinter.Text(master = window)
text_box.pack(side = "left", fill = "both", expand = True)
window.mainloop()
1
一个简单的解决办法是先放置滚动条,然后再放置文本框。pack
有一个叫做 打包顺序 的概念。当它安排这些组件时,会按照你放置的顺序一个一个来,给每个组件分配所需的空间。当空间不够时,后面放的组件就会看不见了。
因为你没有为文本框指定大小,所以它的默认宽度是24个字符。当包含文本框的窗口变小的时候,打包器需要缩小或者移除一些组件,以便所有东西都能放下。当它这样做时,会从打包顺序中的最后一个组件开始。在你最初的例子中,最后一个组件就是滚动条,这就是为什么它会消失的原因。
先放置滚动条会把文本框移到打包顺序的最后面,这样当空间不够时,打包器会先缩小文本框。
import tkinter
window = tkinter.Tk()
text_box = tkinter.Text(master = window)
vertical_scrollbar = tkinter.Scrollbar(master = window, command = text_box.yview)
vertical_scrollbar.pack(side = "right", fill = "y")
text_box.pack(side = "left", fill = "both", expand = True)
window.mainloop()
想要了解pack
是如何工作的详细描述,可以查看 Tcl/Tk文档中的打包算法。