在窗口调整大小时调整Tkinter Listbox小部件的大小

时间:2010-11-30 20:14:46

标签: python listbox resize tkinter

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

基本上我想要一个流畅的高度/宽度列表框。如果有人可以给我指点文档或提供一些代码/见解,我会很感激。

2 个答案:

答案 0 :(得分:4)

您希望了解几何管理器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()

答案 1 :(得分:0)

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

SPECS:

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

如果您的列表框位于框架中,则该框架还需要使用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=选项。另外,您将需要配置列表框所在的 row column

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选项使列表框粘贴到“北部”(顶部),“南部”(底部),“东部”(右侧)和“西部”(拉伸时,单元格的左侧)。

如果列表框放置在框架内,则需要将列和 row 配置为框架,并配置列表框所在的

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)

如果您想了解填充展开之间的区别,请参见以下链接。 https://effbot.org/tkinterbook/pack.htm