当窗口大小改变时,如何调整 Tkinter Listbox 小部件的大小

18

我是Tkinter的新手,我有一个Listbox小部件,希望在更改主窗口大小时自动调整其大小。

本质上,我想要一个流体高度/宽度的Listbox。如果有人可以指向一些文档或提供一些代码/见解,我会很感激。

2个回答

14

你想了解几何管理器packgrid,它们可以让你在窗口中放置小部件并指定它们是否可伸缩。还有第三种几何管理器place,但它使用得不太频繁。

这里是一个简单的示例:

import tkinter as tk

root = tk.Tk()
scrollbar = tk.Scrollbar(root, orient="vertical")
lb = tk.Listbox(root, width=50, height=20, yscrollcommand=scrollbar.set)
scrollbar.config(command=lb.yview)

scrollbar.pack(side="right", fill="y")
lb.pack(side="left",fill="both", expand=True)

for i in range(0,100):
    lb.insert("end", "item #%s" % i)

root.mainloop()

如果你想使用grid代替pack,请删除调用pack的两行代码,并使用以下四行代码替换它们:

root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

scrollbar.grid(row=0, column=1, sticky="ns")
lb.grid(row=0, column=0, sticky="nsew")

请注意,使用 grid 布局时,您需要额外配置包含列表框的行和列的 weight 属性,否则 tkinter 不会为该窗口小部件分配任何额外的空间。


谢谢Bryan,我还不太清楚pack和grid的优劣之处,需要花些时间阅读现有的文档。 - garen
1
网格布局适用于需要以网格形式布置物品的情况,而打包布局则更适合将小部件水平或垂直排列(尽管实际上比这更复杂,因为许多类型的布局都可以使用其中任意一种来实现)。 - Bryan Oakley
@BryanOakley 我知道这篇文章有点旧了,但您的示例展示了如何在使用 pack 几何管理器时扩展列表框。由于 grid 几何管理器不接受 expand 选项,您能否提供一个简单的示例,在使用 grid 几何管理器时使列表框可扩展? - Chris Collett
1
@Engineer_Chris:好的,我已经添加了一个使用 grid 的示例。 - Bryan Oakley

3
两种让列表框在窗口调整大小时自动拉伸的主要方法是使用 .pack().grid() 方法。

规格:

Windows 7,Python 3.8.1,tkinter 版本:8.6

.pack()

我发现最简单的方法是使用 .pack() 方法,并利用 fill=expand=True 选项。

import tkinter as tk

root=tk.Tk()                                              #Creates the main window

listbox=tk.Listbox(root)                                  #Create a listbox widget

listbox.pack(padx=10,pady=10,fill=tk.BOTH,expand=True)    #fill=tk.BOTH, stretch vertically and horizontally
                                                          #fill=tk.Y, stretch vertically
                                                          #fill=tk.X, stretch horizontally

如果你的列表框放在一个frame中,那么这个frame也需要使用fill=expand=True选项。

import tkinter as tk

root=tk.Tk()

frame1=tk.Frame(root)
frame1.pack(fill=tk.BOTH, expand=True)

listbox=tk.Listbox(frame1)
listbox.pack(padx=10,pady=10,fill=tk.BOTH,expand=True)

.grid()

另一种方法是使用.grid()方法并利用sticky=选项。此外,您需要配置列表框所在的

import tkinter as tk

root=tk.Tk()  #create window
root.columnconfigure(0,weight=1)    #confiugures column 0 to stretch with a scaler of 1.
root.rowconfigure(0,weight=1)       #confiugures row 0 to stretch with a scaler of 1.

listbox=tk.Listbox(root)
listbox.grid(row=0,column=0,padx=5,pady=5,sticky='nsew')   
sticky选项会使列表框在被拉伸时“粘”在单元格的“North”(顶部),“South”(底部),“East”(右侧)和“West”(左侧)边缘。
如果您的列表框放置在frame中,您需要配置frame所在的columnrow,以及配置listbox所在的columnrow
import tkinter as tk

root=tk.Tk()               #create window
root.columnconfigure(0,weight=1)  
root.rowconfigure(0,weight=1)

frame1=tk.Frame(root)
frame1.grid(row=0,column=0,sticky='nsew')
frame1.columnconfigure(0,weight=1)
frame1.rowconfigure(0,weight=1)

listbox=tk.Listbox(frame1)
listbox.grid(row=0,column=0,padx=5,pady=5,sticky='nsew')

.pack() & .grid()

现在有一种另外的技术,但是有些人并不赞成。第三种技术是在同一个脚本中同时使用.pack()方法和.grid()方法。只要每个容器中只使用一种管理类型,你就可以混合使用不同的几何管理方法。以下是一个示例。

import tkinter as tk

root=tk.Tk()               #create window

frame1=tk.Frame(root)                                #container: root
frame1.pack(fill=tk.BOTH,expand=True)                               
frame1.columnconfigure(0,weight=1)
frame1.rowconfigure(0,weight=1)
frame1.rowconfigure(1,weight=1)

listbox=tk.Listbox(frame1)                            #container: frame1
listbox.grid(row=0,rowspan=2,column=0,padx=5,pady=5,sticky='nsew') 

btn1=tk.Button(frame1,text='Demo1')                   #container: frame1        
btn1.grid(row=0,column=1, padx=5, pady=5)                          

btn2=tk.Button(frame1,text='Demo2')                   #container: frame1     
btn2.grid(row=1,column=1, padx=5, pady=5)                          

frame2=tk.Frame(root)                                 #container: root 
frame2.pack()

btn3=tk.Button(frame2,text='Demo3')                   #container: frame2
btn3.grid(row=0,column=0)                                          

从上面可以看到,框架使用了.pack(),而列表框和按钮使用了.grid()。这是因为框架位于root容器内,而列表框和按钮则分别位于它们各自的框架内。


要检查你的tkinter版本,请使用:

import tkinter as tk
print(tk.TkVersion)

如果你想了解在IT技术中,fillexpand之间的区别,请查看以下链接。 https://effbot.org/tkinterbook/pack.htm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接