【问题标题】:Resize Tkinter Listbox widget when window resizes调整窗口大小时调整 Tkinter Listbox 小部件的大小
【发布时间】:2011-05-18 02:45:33
【问题描述】:

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

基本上我想要一个流动的高度/宽度列表框。如果有人可以向我指出一些文档或提供一些代码/见解,我将不胜感激。

【问题讨论】:

    标签: python listbox resize tkinter


    【解决方案1】:

    您想阅读几何管理器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")
    

    请注意,对于网格,您必须采取额外步骤为包含列表框的行和列配置 weight,否则 tkinter 不会为小部件分配任何额外空间。

    【讨论】:

    • 感谢 Bryan,对于 pack 与 grid 的优势,我仍然有点困惑,需要花一些时间来处理现有文档。
    • 如果您需要在网格中布置东西,Grid 很有用,pack 对于将小部件放置在水平或垂直排列中更有用一些(尽管它比这更复杂一些,因为许多类型的布局可以用任何一个来实现)
    • @BryanOakley 我知道这篇文章有点老了,但是您的示例显示了如何在使用 pack 几何管理器时扩展列表框。由于grid 几何管理器不接受选项expand,您能否提供一个使用grid 几何管理器时使列表框可扩展的简单示例?
    • @Engineer_Chris:当然,我添加了一个使用 grid 的示例。
    【解决方案2】:

    在调整窗口大小时允许列表框拉伸的两种主要方法是使用 .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
    

    如果您的列表框放置在框架中,则该框架还需要使用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= 选项。此外,您还需要配置列表框所在的 rowcolumn

    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 选项使列表框到“北”(上)、“南”(下)、“东”(右)和“西”(左)拉伸时单元格的两侧。

    如果您的列表框放置在 frame 内,则需要配置 frame 的 columnrow strong> 所在,同时配置 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)
    

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

    【讨论】:

      猜你喜欢
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多