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

时间:2014-03-19 09:24:04

标签: python listbox tkinter

我正在尝试在我的超文本程序中的框架中插入一个列表框。 此列表框启动为空,但在使用过程中应显示一个或多个项目。 我想给它一个固定的高度(比如8个项目)并使用滚动条查看更多。

我将代码归结为以下内容 - 如果你运行它,你会发现该程序不服从'height = 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 个答案:

答案 0 :(得分:1)

问题是您正在列出列表框中的滚动条(以及文本框内)。这不是你应该做的事情 - 滚动条需要存在于他们控制的小部件之外。

因为您将滚动条打包在列表框中,所以包几何管理器现在控制列表框的宽度和高度,使其缩小到完全适合其内容。您可以关闭列表框(sfsearchresultsbox.pack_propagate(False))的几何传播,但这不是一个合适的解决方案。真正的解决方法是将滚动条移动到它们包含的小部件之外。

除了几何问题之外,在他们控制的小部件中打包滚动条的另一个问题是滚动条将位于小部件中的任何数据之上。例如,水平滚动条会遮挡最后一条可见线。

如果您希望滚动条显示在列表框的边框内,请为列表框指定边框宽度为0(零),然后将列表框和滚动条放在边框宽度为1(一)的框架内。您可以获得相同的视觉效果,而不会出现与在窗口小部件中打包滚动条相关的问题。