Python 在等权重网格管理器中大小不同的按钮?

Python 在等权重网格管理器中大小不同的按钮?,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,为什么在网格中使用相同的权重时,这些按钮的大小不同 class Screen(tk.Tk): def __init__(self): super().__init__() f = tk.Frame(self) f.pack(fill=tk.BOTH, expand=True) f.grid_columnconfigure(0, weight=1) f.grid_columnconfigure(1, wei

为什么在网格中使用相同的权重时,这些按钮的大小不同

class Screen(tk.Tk):

    def __init__(self):
        super().__init__()

        f = tk.Frame(self)
        f.pack(fill=tk.BOTH, expand=True)
        f.grid_columnconfigure(0, weight=1)
        f.grid_columnconfigure(1, weight=1)
        f.grid_columnconfigure(2, weight=1)
        f.grid_columnconfigure(3, weight=1)

        l1 = tk.Label(f, text='Text')
        l1.grid(row=0, column=0, columnspan=4, sticky='nsew')

        l2 = tk.Label(f, text='Text', anchor='w')
        l2.grid(row=1, column=0, sticky='sw')

        self.e1 = tk.Entry(f)
        self.e1.grid(row=2, column=0, columnspan=3, sticky='nsew')

        self.b1 = tk.Button(f, text='B1')
        self.b1.grid(row=2, column=3, sticky='nsew')

        l3 = tk.Label(f, text='Text', anchor='w')
        l3.grid(row=3, column=0, sticky='sw')

        self.e2 = tk.Entry(f)
        self.e2.grid(row=4, column=0, ipady=2, columnspan=3, sticky='nsew')

        self.b2 = tk.Button(f, text='B2')
        self.b2.grid(row=5, column=2, sticky='nsew')
        self.b3 = tk.Button(f, text='B3')
        self.b3.grid(row=5, column=3, sticky='nsew', command=self.test)

        self.update_idletasks()
        self.geometry(f'500x{self.winfo_reqheight()}')
        self.resizable(False, False)

    def test(self):
        a = self.b1.winfo_width()
        b = self.b2.winfo_width()
        c = self.b3.winfo_width()
        print(a, b, c)
输出:
111 110 111

按钮
B1
B3
位于网格的第3列,
B2
位于第2列。确保它们大小相同的唯一方法是将它们的
width
配置设置为
width=10

所需布局:

+---------------------------------------------------------+
|                             L1                          |
+--------------+------------+--------------+--------------+
|      L2      |            |              |              |
+--------------+------------+--------------+--------------+
|                     E1                   |      B1      |
+--------------+------------+ -------------+--------------+
|      L3      |            |              |              |
+--------------+------------+--------------+--------------+
|                     E2                   |              |
+--------------+------------+ -------------+--------------+
|              |            |      B2      |      B3      |
+--------------+------------+--------------+--------------+
试着使柱子尽可能接近均匀的比例。但是布局是一个5行4列的网格。顶部标签
L1
将跨越第一行中的所有列。两个条目小部件
E1
E2
将跨越各自行中的前3列。由于某些原因,
B2
接收的大小较小

编辑:我能确定的最好结果是
条目
小部件会导致加权问题,但我不知道为什么。Bryan Oakley回答了同样的问题,但我不明白为什么小部件上的默认宽度不会被网格管理器的权重关键字覆盖

问题:为什么在网格中使用相同权重时,这些按钮的大小不同

class Screen(tk.Tk):

    def __init__(self):
        super().__init__()

        f = tk.Frame(self)
        f.pack(fill=tk.BOTH, expand=True)
        f.grid_columnconfigure(0, weight=1)
        f.grid_columnconfigure(1, weight=1)
        f.grid_columnconfigure(2, weight=1)
        f.grid_columnconfigure(3, weight=1)

        l1 = tk.Label(f, text='Text')
        l1.grid(row=0, column=0, columnspan=4, sticky='nsew')

        l2 = tk.Label(f, text='Text', anchor='w')
        l2.grid(row=1, column=0, sticky='sw')

        self.e1 = tk.Entry(f)
        self.e1.grid(row=2, column=0, columnspan=3, sticky='nsew')

        self.b1 = tk.Button(f, text='B1')
        self.b1.grid(row=2, column=3, sticky='nsew')

        l3 = tk.Label(f, text='Text', anchor='w')
        l3.grid(row=3, column=0, sticky='sw')

        self.e2 = tk.Entry(f)
        self.e2.grid(row=4, column=0, ipady=2, columnspan=3, sticky='nsew')

        self.b2 = tk.Button(f, text='B2')
        self.b2.grid(row=5, column=2, sticky='nsew')
        self.b3 = tk.Button(f, text='B3')
        self.b3.grid(row=5, column=3, sticky='nsew', command=self.test)

        self.update_idletasks()
        self.geometry(f'500x{self.winfo_reqheight()}')
        self.resizable(False, False)

    def test(self):
        a = self.b1.winfo_width()
        b = self.b2.winfo_width()
        c = self.b3.winfo_width()
        print(a, b, c)
它只是加权的,不是计算的。它取决于使用的小部件和列跨度。
如果您使用的是
sticky='nsew'
,如果您不想发展到
sn
,请更改为
sticky='ew'


一个可能的选项是,使用不同的
weight=
值,给网格管理器一个提示,您希望哪个小部件的权重更大,例如:

            f.grid_columnconfigure(0, weight=1)
            f.grid_columnconfigure(1, weight=1)
            f.grid_columnconfigure(2, weight=2)
            f.grid_columnconfigure(3, weight=4)

另一个选项是,使用
.grid\u columnconfigure(c,minsize=)

这将强制网格管理器遵守列的
minsize=

来源
tkinter.\uuuuu init\uuuuuuu:def grid\u column配置(…

有效资源包括:

  • minsize(柱的最小尺寸)
  • 权重(向该列传播多少额外空间)
  • pad(额外留出多少空间)
但结果也是不可预测的,充其量是在固定的窗口大小下


要使其能够调整窗口大小,请将
事件绑定到
框架

为每列设置相同的计算值
minsize=

将tkinter作为tk导入
类应用程序(tk.tk):
定义初始化(自):
super()。\uuuu init\uuuuu()
f=传统框架(自身)
f、 包装(填充=tk.BOTH,展开=True)
f、 绑定(“”,self.on_configure)
...
def on_配置(自身、事件):
w=事件.widget
columns=w.网格大小()[0]
minsize=w.winfo_width()//列
对于范围内的c(列):
w、 网格配置(c,minsize=minsize)
如果名称=“\uuuuu main\uuuuuuuu”:
App().mainloop()
使用Python:3.5-“Tcl版本”:8.6“TkVersion”:8.6测试

问题:为什么在网格中使用相同权重时,这些按钮的大小不同

class Screen(tk.Tk):

    def __init__(self):
        super().__init__()

        f = tk.Frame(self)
        f.pack(fill=tk.BOTH, expand=True)
        f.grid_columnconfigure(0, weight=1)
        f.grid_columnconfigure(1, weight=1)
        f.grid_columnconfigure(2, weight=1)
        f.grid_columnconfigure(3, weight=1)

        l1 = tk.Label(f, text='Text')
        l1.grid(row=0, column=0, columnspan=4, sticky='nsew')

        l2 = tk.Label(f, text='Text', anchor='w')
        l2.grid(row=1, column=0, sticky='sw')

        self.e1 = tk.Entry(f)
        self.e1.grid(row=2, column=0, columnspan=3, sticky='nsew')

        self.b1 = tk.Button(f, text='B1')
        self.b1.grid(row=2, column=3, sticky='nsew')

        l3 = tk.Label(f, text='Text', anchor='w')
        l3.grid(row=3, column=0, sticky='sw')

        self.e2 = tk.Entry(f)
        self.e2.grid(row=4, column=0, ipady=2, columnspan=3, sticky='nsew')

        self.b2 = tk.Button(f, text='B2')
        self.b2.grid(row=5, column=2, sticky='nsew')
        self.b3 = tk.Button(f, text='B3')
        self.b3.grid(row=5, column=3, sticky='nsew', command=self.test)

        self.update_idletasks()
        self.geometry(f'500x{self.winfo_reqheight()}')
        self.resizable(False, False)

    def test(self):
        a = self.b1.winfo_width()
        b = self.b2.winfo_width()
        c = self.b3.winfo_width()
        print(a, b, c)
它只是加权的,而不是计算的。它取决于使用的小部件和列跨度。
如果您使用的是
sticky='nsew'
,如果您不想发展到
sn
,请更改为
sticky='ew'


一个可能的选项是,使用不同的
weight=
值,给网格管理器一个提示,您希望哪个小部件的权重更大,例如:

            f.grid_columnconfigure(0, weight=1)
            f.grid_columnconfigure(1, weight=1)
            f.grid_columnconfigure(2, weight=2)
            f.grid_columnconfigure(3, weight=4)

另一个选项是,使用
.grid\u columnconfigure(c,minsize=)

这将强制网格管理器遵守列的
minsize=

来源
tkinter.\uuuuu init\uuuuuuu:def grid\u column配置(…

有效资源包括:

  • minsize(柱的最小尺寸)
  • 权重(向该列传播多少额外空间)
  • pad(额外留出多少空间)
但结果也是不可预测的,充其量是在固定的窗口大小下


要使其能够调整窗口大小,请将
事件绑定到
框架

为每列设置相同的计算值
minsize=

将tkinter作为tk导入
类应用程序(tk.tk):
定义初始化(自):
super()。\uuuu init\uuuuu()
f=传统框架(自身)
f、 包装(填充=tk.BOTH,展开=True)
f、 绑定(“”,self.on_configure)
...
def on_配置(自身、事件):
w=事件.widget
columns=w.网格大小()[0]
minsize=w.winfo_width()//列
对于范围内的c(列):
w、 网格配置(c,minsize=minsize)
如果名称=“\uuuuu main\uuuuuuuu”:
App().mainloop()

用Python测试:3.5-“Tcl版本”:8.6“TkVersion”:8.6

网格的
权重=
选项控制如何将多余的空间分配给列(和行)。要强制列大小相等,您需要使用
uniform=
。@jasonharper我没有看到任何关于这方面的文档keyword@dattatkinter的文档有时是不完整的,您可能需要在@jasonharper中阅读。请查看编辑的hyperlinkGrid的
weight=
选项控制如何将多余的空间分配给columns(和行)。要强制列大小相等,您需要使用
uniform=
。@jasonharper我没有看到任何关于这方面的文档keyword@dattatkinter的文档有时不完整,您可能需要在@jasonharper中阅读。请查看编辑的超链接