无法在Tkinter中显示高度固定的列表框

0 投票
1 回答
577 浏览
提问于 2025-04-17 22:56

我正在尝试在我的超文本程序中,在一个框架里插入一个列表框。这个列表框一开始是空的,但在使用过程中应该能显示一个或多个项目。我想给它一个固定的高度(比如说能显示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)里。这样你就能得到相同的视觉效果,而不会遇到把滚动条放在组件里面带来的问题。

撰写回答