如何使用网格管理器让列表框填满整个框架?

0 投票
1 回答
4344 浏览
提问于 2025-04-18 13:20

考虑一下下面这个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网格几何管理器

撰写回答