无法在Tkinter中显示高度固定的列表框
我正在尝试在我的超文本程序中,在一个框架里插入一个列表框。这个列表框一开始是空的,但在使用过程中应该能显示一个或多个项目。我想给它一个固定的高度(比如说能显示8个项目),然后用滚动条来查看更多内容。
我把代码简化成了下面这个样子——如果你运行它,你会发现程序并没有按照“高度=8”的要求来做……
我缺少了什么呢?
#!/usr/bin/env python
from Tkinter import *
import ttk
root = Tk()
root.geometry("%dx%d+0+0" % (1420,840))
root.title("inFolder")
configtext = Text(root, width=150)
yscrollbar=Scrollbar(root, orient=VERTICAL, command=configtext.yview)
configtext["yscrollcommand"]=yscrollbar.set
auxframe=Frame(root)
chtext = Text(auxframe, width=50)
chxscrollbar=Scrollbar(chtext, orient=HORIZONTAL, command=chtext.xview)
chtext["xscrollcommand"]=chxscrollbar.set
chxscrollbar.pack(side="bottom",fill="x", expand=False)
# --------------- searchframe ----------
searchframe=Frame(auxframe)
encasef=Frame(searchframe)
encasef.pack()
sfe1 = Entry(encasef,width=30)
sfe1.pack(side=LEFT)
sfnocase = Checkbutton(encasef, text="Case")
sfnocase.pack()
sfsearchresultsbox = Listbox(searchframe,height=8)
sfsearchresultsbox.pack(fill=BOTH,expand=1)
sfsb = Scrollbar(sfsearchresultsbox, orient=VERTICAL, command=sfsearchresultsbox.yview)
sfsb.pack(side=RIGHT, fill=Y)
sfsearchresultsbox['yscrollcommand'] = sfsb.set
# GRID
auxframe.grid(column=0,row=1,sticky=E+W+S+N)
searchframe.grid(column=0,row=1,sticky=E+W+S+N)
chtext.grid(column=0,row=0,sticky=E+W+S+N)
configtext.grid(column=1,row=1,sticky=E+W+S+N)
yscrollbar.grid(column=2, row=1, sticky=N+S)
Grid.columnconfigure(root,0,weight=1)
Grid.columnconfigure(root,1,weight=0)
root.rowconfigure(1, weight=1)
auxframe.grid_rowconfigure(0, weight=1)
auxframe.grid_columnconfigure(0, weight=1)
configtext.insert(INSERT,"test 1\ntest 2\ntest 3\ntest 4\n\ntest x\n")
#------------------------------
mainloop()
1 个回答
1
问题在于你把滚动条放在了列表框(listbox)里面(还有你的文本框里)。这样做是不对的——滚动条应该放在它们控制的组件外面。
因为你把滚动条放在了列表框里面,所以现在这个列表框的大小是由滚动条来决定的,导致它的大小缩小到刚好能装下里面的内容。你可以通过关闭列表框的几何属性(sfsearchresultsbox.pack_propagate(False)
)来解决这个问题,但这并不是一个好的解决办法。真正的解决方法是把滚动条移到它们控制的组件外面。
除了几何问题,把滚动条放在它们控制的组件里面还有一个问题,就是滚动条会遮住组件里面的数据。例如,水平滚动条会挡住最后一行可见的内容。
如果你想让滚动条看起来像是在列表框的边框内,可以把列表框的边框宽度设置为0,然后把列表框和滚动条放在一个边框宽度为1的框架(frame)里。这样你就能得到相同的视觉效果,而不会遇到把滚动条放在组件里面带来的问题。