簡體   English   中英

調整窗口大小時調整 Tkinter 列表框小部件的大小

[英]Resize Tkinter Listbox widget when window resizes

我是 Tkinter 的新手,我有一個Listbox小部件,我想在更改主窗口的大小時自動調整它的大小。

基本上我想要一個流暢的高度/寬度列表框。 如果有人可以向我指出一些文檔或提供一些代碼/見解,我將不勝感激。

您想閱讀幾何管理器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 不會為小部件分配任何額外的空間。

在調整窗口大小時允許列表框拉伸的兩種主要方法是使用.pack().grid()方法。

眼鏡:

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=選項。 此外,您需要配置列表框所在的

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選項使列表框在拉伸時在單元格的“北”(上)、“南”(下)、“東”(右)和“西”(左)側。

如果你的列表框放在一個框架之內,你將需要配置的框架是,與配置沿着列表框在不在。

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() 這是可能的,因為框架位於容器中,而列表框和按鈕位於各自的框架中。


要檢查您的 tkinter 版本,請使用:

import tkinter as tk
print(tk.TkVersion)

如果您想了解fillexpand之間的區別,請參閱以下鏈接。 https://effbot.org/tkinterbook/pack.htm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM