限制列的宽度

时间:2019-05-15 15:13:36

标签: python-3.x tkinter

使用下面的代码,列将扩展到最宽元素的宽度。 如何将宽度限制为20个字符?

    def populate_using_tkinter(frame, project_list):
        label_Name_column = Tkinter.Label(frame, text="Name",  anchor="w", borderwidth=1 relief="solid")
        label_Detail_column = Tkinter.Label(frame, text="Detail", borderwidth=1, relief="solid")
        label_Name_column.grid(row=0, column=3, sticky=("W", "E"))
        label_Detail_column.grid(row=0, column=4, sticky=("W", "E"))

2 个答案:

答案 0 :(得分:2)

通常来说,grid几何管理器不允许您设置列的最大大小。它旨在缩小或增长以完全适合其内容。

一种解决方案是将框架用于列,然后可以配置框架以保留特定的宽度。该解决方案的主要缺点是您不再具有本身网格-您拥有一系列的列。如果列中的项目具有不同的高度,则很难使您的行对齐。

一个更简单的解决方案是确保所有小部件的首选宽度小于所需的列大小。然后,您可以设置列的大小,并使小部件展开以填充。当您这样做时,它们只会扩展到列的大小,而不会扩展到其最大大小。

这是一个包含两列的简单示例,其中第二列被限制为100像素。通过设置列的minsizeweight为零,然后创建小于minsize的标签窗口小部件,可以做到这一点。通过使小部件贴在列的两侧,它将变成100像素宽。

import tkinter as tk

root = tk.Tk()
root.geometry("300x100")

# We want to constrain the column to 100 pixels, so we
# set a minsize and a weight of zero so that it will
# not grow any larger. 
root.columnconfigure(1, minsize=100, weight=0)

# Add two labels. For the label in the second column we will
# force its size to be as small as possible. Later, we will
# configure it to grow to fill its column
label1 = tk.Label(root, text="This is a wide label", background="pink")
label2 = tk.Label(root, anchor="w", width=1, text="This is also a wide label", background="bisque")

# Add the labels, and configure them to fill their columns
label1.grid(row=0, column=0, sticky="nsew")
label2.grid(row=0, column=1, sticky="nsew")

root.mainloop()

screenshot

答案 1 :(得分:1)

这是grid_propagate的一个示例,应该足够清楚地说明它如何影响容器。在这里,我们使用2帧和2个按钮。通过这些按钮,可以更轻松地显示每个小部件和容器的扩展方式,还可以显示如何锁定框架的大小。

请记住,每个帧的宽度和高度均以像素为单位。窗口小部件设置为字符的长度和高度,因此它受字体格式的影响,但在此示例中我们无需显示。

如果您有任何疑问,请告诉我。

import tkinter as tk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.columnconfigure(1, weight=1)

        left_frame = tk.Frame(self, width=200, height=200)
        left_frame.grid(row=0, column=0)
        left_frame.rowconfigure(0, weight=1)
        left_frame.columnconfigure(0, weight=1)
        left_frame.grid_propagate(False)

        right_frame = tk.Frame(self)
        right_frame.grid(row=0, column=1, sticky='nsew')
        right_frame.rowconfigure(0, weight=1)
        right_frame.columnconfigure(0, weight=1)

        tk.Button(left_frame, text='test left frame').grid(row=0, column=0, sticky='nsew')
        tk.Button(right_frame, text='test right frame').grid(row=0, column=0, sticky='nsew')


App().mainloop()