Columnspan 小部件丢弃列

Columnspan Widget Throwing Off Columns

我无法将我的第一个 "None" 复选框小部件放在我想要的位置。这是一个 link 的截图。

我正在尝试让 "None" 复选框小部件直接位于条目小部件的右侧。包含 spinbox 小部件的底部行包含在位于 row=7、column=2 的 LabelFrame 小部件中,该小部件的列跨度为 2。我的第一个复选框小部件位于 row=5、column=3 和 sticky='w' .为什么它不在 row=5, column=2 处与 Entry 小部件相对,因为我给 LabelFrame 的列跨度为 2?

这是我的代码:

tk.Label(GUI, text='label 1').grid(row=0, sticky='w')
tk.Label(GUI, text='label 2').grid(row=1, sticky='w')
tk.Label(GUI, text='label 3').grid(row=2, sticky='w')
tk.Label(GUI, text='label 4').grid(row=3, sticky='w')
tk.Label(GUI, text='label 5').grid(row=4, sticky='w')
tk.Label(GUI, text='label 6').grid(row=5, sticky='w')
tk.Label(GUI, text='label 7').grid(row=6, sticky='w')
tk.Label(GUI, text='label 8').grid(row=7, sticky='w')
tk.Label(GUI, text='label 9').grid(row=8, sticky='w')

tk.Label(GUI, text='$').grid(row=2, column=1, sticky='w')
tk.Label(GUI, text='$').grid(row=3, column=1, sticky='w')
tk.Label(GUI, text='$').grid(row=4, column=1, sticky='w')

tk.Label(GUI, text='9999').grid(row=2, column=2, sticky='w')

input1 = tk.Entry(GUI, width=10)
input2 = tk.Entry(GUI, width=10)
input3 = tk.Entry(GUI, width=10)
button_input = tk.Checkbutton(GUI, text='None')
input5 = tk.Entry(GUI, width=10)

date_field = tk.LabelFrame(GUI)
scheduled_start_month_input = tk.Spinbox(date_field, from_=1, to=12, width=2)
scheduled_start_day_input = tk.Spinbox(date_field, from_=1, to=31, width=2)
scheduled_start_year_input = tk.Spinbox(date_field, from_=2018, to=2025, width=4)
scheduled_start_hour_input = tk.Spinbox(date_field, from_=0, to=23, width=2)
scheduled_start_minute_input = tk.Spinbox(date_field, from_=0, to=59, width=2)
start_on_launch_option = tk.Checkbutton(date_field, onvalue=True, offvalue=False, text='On Launch')
scheduled_stop_month_input = tk.Spinbox(date_field, from_=1, to=12, width=2)
scheduled_stop_day_input = tk.Spinbox(date_field, from_=1, to=31, width=2)
scheduled_stop_year_input = tk.Spinbox(date_field, from_=2018, to=2025, width=4)
scheduled_stop_hour_input = tk.Spinbox(date_field, from_=0, to=23, width=2)
scheduled_stop_minute_input = tk.Spinbox(date_field, from_=0, to=59, width=2)
scheduled_stop_none = tk.Checkbutton(date_field, onvalue=True, offvalue=False, text='None')


input1.grid(row=3, column=2, sticky='w')
input2.grid(row=4, column=2, sticky='w')
input3.grid(row=5, column=2, sticky='w')
button_input.grid(row=5, column=3, sticky='w')
input5.grid(row=6, column=2, sticky='w')

date_field.grid(row=7, column=2, rowspan=2, columnspan=2, sticky='w')
scheduled_start_month_input.grid(column=0)
tk.Label(date_field, text='/').grid(column=1, row=0)
scheduled_start_day_input.grid(column=2, row=0)
tk.Label(date_field, text='/').grid(column=3, row=0)
scheduled_start_year_input.grid(column=4, row=0)
tk.Label(date_field, text=' ').grid(column=5, row=0)
scheduled_start_hour_input.grid(column=6, row=0)
tk.Label(date_field, text=':').grid(column=7, row=0)
scheduled_start_minute_input.grid(column=8, row=0)
start_on_launch_option.grid(row=0, column=9)

scheduled_stop_month_input.grid(column=0)
tk.Label(date_field, text='/').grid(column=1, row=1)
scheduled_stop_day_input.grid(column=2, row=1)
tk.Label(date_field, text='/').grid(column=3, row=1)
scheduled_stop_year_input.grid(column=4, row=1)
tk.Label(date_field, text=' ').grid(column=5, row=1)
scheduled_stop_hour_input.grid(column=6, row=1)
tk.Label(date_field, text=':').grid(column=7, row=1)
scheduled_stop_minute_input.grid(column=8, row=1)
scheduled_stop_none.grid(column=9, row=1, sticky='w')

tk.Button(GUI, text='Launch').grid(row=9, sticky='w')

GUI.mainloop()

添加以下代码:

GUI.grid_columnconfigure(3, weight=1)

这意味着第 3 列将占据它能到达的所有位置。 Your/default 权重为 0。 这意味着 Checkbutton 实例与 "None" 文本一样宽,因此粘性 w 等于粘性 e 等于粘性 we 或 wens。如果您将权重设置为 1,那么您的粘性参数实际上会发生。

问题是第 2 列比您想象的要宽。要查看它,请更改将输入小部件添加到网格的行,使其看起来像这样:

input3.grid(row=5, column=2, sticky='ew')

您会看到复选按钮实际上是最左边的,它左边的列负责所有额外的 space。

原因是 datefield 小部件跨越两列,但是这两列的宽度不足以容纳日期字段。 grid 必须向列添加额外的 space 以便小部件适合。

如果您希望第二列保持固定大小并让第 3 列增长和缩小,您必须为第 3 列赋予 non-zero 权重,以便 grid将所有额外的 space 分配给该列。

您可以通过在某处添加这行代码来做到这一点:

GUI.grid_columnconfigure(3, weight=1)

另一个解决方案是将权重添加到不可见的第 4 列,然后 datefield 跨越三列而不是两列。这将导致第 2 列和第 3 列保持其自然大小,并且任何额外的 space 将被赋予一个空列。

GUI.grid_columnconfigure(4, weight=1)
date_field.grid(row=7, column=2, rowspan=2, columnspan=3, sticky='w')