我是Tkinter的新手,我有一个Listbox
小部件,我想在更改主窗口大小时自动调整大小。
基本上我想要一个流畅的高度/宽度列表框。如果有人可以给我指点文档或提供一些代码/见解,我会很感激。
答案 0 :(得分:4)
您希望了解几何管理器pack和grid,它们允许您将窗口小部件放在窗口中,并指定它们是否增长和缩小。还有第三个几何管理器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()
方法,并使用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()
方法并利用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 配置为框架插入strong>,并配置列表框所在的列和行。
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()
方法。您可以在同一脚本中混合使用不同的几何图形管理方法,只要每个容器仅使用一种管理类型即可。您可以在下面看到一个示例。
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