【问题标题】:Columnspan Widget Throwing Off ColumnsColumnspan 小部件扔掉列
【发布时间】:2019-06-26 21:37:01
【问题描述】:

我无法将我的第一个“无”复选框小部件放在我想要的位置。这是屏幕截图的链接。

我试图让“无”复选框小部件直接位于条目小部件的右侧。包含旋转框小部件的底部行包含在位于 row=7、column=2、columnspan 为 2 的 LabelFrame 小部件中。我的第一个复选框小部件位于 row=5、column=3 且sticky='w'。既然我给 LabelFrame 的列跨度为 2,为什么它不与行 = 5、列 = 2 处的 Entry 小部件相对?

这是我的代码:

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()

【问题讨论】:

  • 当所有布局代码组合在一起时,布局问题几乎总是更容易调试。

标签: python tkinter tkinter-layout


【解决方案1】:

问题是第二列比你想象的要宽。要查看它,请更改将输入小部件添加到网格的行,使其如下所示:

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

您会看到,复选按钮实际上位于最左侧,它左侧的列负责所有额外的空间。

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

如果您希望第二列保持固定大小并让第 3 列成为增长和缩小的列,则必须为第 3 列赋予非零权重,以便grid 可以为其分配所有额外空间列。

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

GUI.grid_columnconfigure(3, weight=1)

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

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

【讨论】:

  • 感谢您的详细解释!我周一才开始使用 tkinter,由于文档不是很详尽,因此我很难找到信息。
【解决方案2】:

添加以下代码:

GUI.grid_columnconfigure(3, weight=1)

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

【讨论】:

  • 即使您的代码建议有效,您的解释也不正确。 “粘性”选项工作得很好。问题不在于该列需要更宽才能使“粘性”起作用,而是其左侧的列比它包含的条目小部件更宽。您可以通过获取原始代码并为条目小部件使用粘性“ew”来看到这一点。
  • 我编辑了有争议的“第 3 列”并将其更改为“Checkbutton 实例”。关键是如果没有 grid_columnconfigure Checkbutton left/x 从旋转框占用空间的一半开始。
  • 描述仍然不准确。该列上的“粘性”属性工作得很好。问题不在于检查按钮左侧的空白,而在于其左侧列右侧的空白。
猜你喜欢
  • 1970-01-01
  • 2015-03-19
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多