Tkinter grid方法异常:Listbox无法移至GUI底部
解决Tkinter Listbox无法移至界面底部的问题
问题原因
Tkinter的grid布局中,行号仅代表逻辑排列顺序,空行默认高度为0。即便设置row=200,中间的空行不会自动撑开空间,Listbox依然会紧跟前面的非空行(按钮所在的row=1)。单独设置sticky='s'无效,因为没有多余空间支撑它“贴到底部”;直接给大数值行号设置weight=1则会打乱整体布局结构。
解决方案
通过垂直权重分配让按钮与Listbox之间的行占据所有剩余垂直空间,从而将Listbox推至界面底部。具体操作:
- 在按钮所在行之后,设置一个填充行并赋予
weight=1,让它自动撑开按钮到Listbox之间的所有空白区域。 - 将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
相关产品推荐
相关产品推荐

