You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter grid方法异常:Listbox无法移至GUI底部

解决Tkinter Listbox无法移至界面底部的问题

问题原因

Tkinter的grid布局中,行号仅代表逻辑排列顺序,空行默认高度为0。即便设置row=200,中间的空行不会自动撑开空间,Listbox依然会紧跟前面的非空行(按钮所在的row=1)。单独设置sticky='s'无效,因为没有多余空间支撑它“贴到底部”;直接给大数值行号设置weight=1则会打乱整体布局结构。

解决方案

通过垂直权重分配让按钮与Listbox之间的行占据所有剩余垂直空间,从而将Listbox推至界面底部。具体操作:

  1. 在按钮所在行之后,设置一个填充行并赋予weight=1,让它自动撑开按钮到Listbox之间的所有空白区域。
  2. 将Listbox放在填充行的下一行,同时设置sticky属性让它贴紧底部并横向适配窗口宽度。

修改后的完整代码

import tkinter as tk

class Manager:
    def __init__(self):
        self.root=tk.Tk()
        self.root.title('password_manager')
        self.root.geometry('500x600')
        self.create_GUI()
        self.storage = {}
        self.root.mainloop()

    def create(self):
        pass

    def open_page(self):
        print('openpage')
        
    def add_new_button(self):
        pass
        
    def add_new(self):
        self.app_title=tk.Label(text='test')
        self.app_title.grid(row=2,column=50)
        self.application_name=tk.Entry(self.root,width=20,font=('arial',18))
        self.username=tk.Entry(self.root,width=20,font=('arial',18))
        self.password=tk.Entry(self.root,width=20,font=('arial',18))
        self.application_name.grid(row=2, column=1)
        self.username.grid(row=3, column=2)
        self.password.grid(row=4, column=3)

        self.app_name_label = tk.Label(self.root, text='Application Name:')
        self.username_label = tk.Label(self.root, text='Username:')
        self.password_label = tk.Label(self.root, text='Password:')

        self.app_name_label.grid(row=2, column=0)
        self.username_label.grid(row=3, column=1)
        self.password_label.grid(row=4, column=2)

        self.password.bind('<Return>',self.hide)
        
    def hide(self,thing):
        username=self.username.get()
        password=self.password.get()
        app_name=self.application_name.get()
        self.application_name.grid_forget()
        self.username.grid_forget()
        self.password.grid_forget()
        self.add_to_memory(username,password,app_name)

    def add_to_memory(self,username,password,app_name):
        if app_name in self.storage.keys():
            return
        else:
            self.storage[app_name]=(username,password)
        print(self.storage)
        
    def create_GUI(self):
        # 放置按钮到row=1
        self.button=tk.Button(self.root,text='add new',font=('arial',18),command=self.add_new)
        self.button.grid(row=1,column=0)
        
        # 设置按钮下方的row=2为填充行,权重1占据所有剩余垂直空间
        self.root.rowconfigure(2, weight=1)
        
        # Listbox放在row=3,sticky='sew'让它贴紧底部和左右两侧,columnspan跨列适配宽度
        self.listbox=tk.Listbox(self.root,width=100)
        self.listbox.grid(row=3, column=0, sticky='sew', columnspan=3)
        
        # 设置列0的权重,让Listbox随窗口宽度自动拉伸
        self.root.columnconfigure(0, weight=1)

Manager()

关键修改说明

  • self.root.rowconfigure(2, weight=1):让row=2自动填充按钮到Listbox之间的所有垂直空白,将Listbox推至底部。
  • self.listbox.grid(row=3, column=0, sticky='sew', columnspan=3):sticky='sew'确保Listbox贴紧底部、左右边缘;columnspan解决多列布局下Listbox宽度不足的问题。
  • self.root.columnconfigure(0, weight=1):让列0随窗口宽度拉伸,Listbox也会同步适配横向空间。

内容的提问来源于stack exchange,提问作者cade232

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:45:46