如何使用网格管理器让列表框填满整个框架?
考虑一下下面这个tk界面;
这里有两个框架,每个框架都在自己的列里,由网格布局管理器来管理。我尝试了几种粘附选项,但我无法让列表框看起来更长。我希望它能够跨越整行。请问我该怎么做?以下是我的代码;
import tkinter as tk
class MinimalTestCase(tk.Frame):
def __init__(self, master, *args, **kwargs):
tk.Frame.__init__(self, master)
self.f1 = tk.Frame(self)
self.f2 = tk.Frame(self)
self.f1.grid(row=0, column=0)
self.f2.grid(row=0, column=1, sticky=(tk.N, tk.S, tk.E, tk.W))
### Fill left frame with dummy elements to demonstrate the problem
for i in range(15):
tk.Label(self.f1, text="Label{}".format(i)).grid(row=i)
### Put listbox on right frame
self.lbox = tk.Listbox(self.f2)
self.lbox.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.E, tk.W))
self.grid()
if __name__ == "__main__":
root=tk.Tk()
MinimalTestCase(root)
root.mainloop()
1 个回答
1
你需要使用 rowconfigure(0, weight=1)
,这个设置不是用在 Listbox
上,而是要用在管理这个布局的父级上,也就是 Frame
。
import Tkinter as tk
class MinimalTestCase(tk.Frame):
def __init__(self, master, *args, **kwargs):
tk.Frame.__init__(self, master)
self.f1 = tk.Frame(self)
self.f2 = tk.Frame(self)
self.f2.rowconfigure(0, weight=1) # <-- row 0 will be resized
self.f1.grid(row=0, column=0)
self.f2.grid(row=0, column=1, sticky=(tk.N, tk.S, tk.E, tk.W))
### Fill left frame with dummy elements to demonstrate the problem
for i in range(15):
tk.Label(self.f1, text="Label{}".format(i)).grid(row=i)
### Put listbox on right frame
self.lbox = tk.Listbox(self.f2)
self.lbox.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.E, tk.W))
self.grid()
if __name__ == "__main__":
root=tk.Tk()
MinimalTestCase(root)
root.mainloop()
Tkinter书籍: Tkinter网格几何管理器