【问题标题】:How to align radio buttons in adjacent rows tkinter?如何对齐相邻行tkinter中的单选按钮?
【发布时间】:2021-08-23 23:52:04
【问题描述】:

我正在 Python tkinter 中制作 GUI。我怎样才能对齐这些 Raidobuttons 使它们都排成一列并且列并排。特别是我希望我的列在左右中间,但现在它们是这样显示的:

这是我的单选按钮代码:

selected_device = StringVar()
devices = ['CAN', 'US', 'EU', 'AU']

for device in devices:
    r = Radiobutton(
        root,
        text=device,
        value=device,
        variable=selected_device
    )
    r.pack(anchor="ne")

selected_source = StringVar()
sources = ['Raw Data', 'Encoded Data']

for source in sources:
    r = Radiobutton(
        root,
        text=source,
        value=source,
        variable=selected_source
    )
    r.pack(anchor="nw")

selected_environment = StringVar()
environments = ['Sprint', 'RC', 'Staging']

for environment in environments:
    r = Radiobutton(
        root,
        text=environment,
        value=environment,
        variable=selected_environment
    )
    r.pack(anchor="n")

【问题讨论】:

  • Have a look at this。如果您确实需要更多帮助,请提供minimal reproducible example
  • 您不能将相同的变量用于多个Radiobutton()
  • @Marino 事实上,单选按钮被设计成共享一个公共变量,不像复选按钮用于多选。
  • 你是对的,只需将StringVar() 设置为None 或所有单选按钮都会被选中。
  • 我不确定我是否明白您的问题,但请尝试使用框架。 3 组单选按钮列需要 3 个框架。此外,如果您不想使用框架,则需要切换到使用.grid

标签: python tkinter


【解决方案1】:

我希望我的列在左右中间,但现在它们是这样显示的:

如果是这样,并且您想继续使用pack,最简单的解决方案是创建三个框架,一个用于左侧,一个用于右侧,一个用于中心。那,或者切换到使用三列的grid

使用pack

创建三个框架,同时使用anchor="w" 让按钮对齐到框架的左侧。

left_frame = Frame(root)
middle_frame = Frame(root)
right_frame = Frame(root)

left_frame.pack(side="left", fill="both", expand=True)
middle_frame.pack(side="left", fill="both", expand=True)
right_frame.pack(side="right", fill="both", expand=True)

for device in devices:
    r = Radiobutton(right_frame, ...)
    r.pack(side="top", anchor="w")
...
for source in sources:
    r = Radiobutton(left_frame, ...)
    r.pack(side="top", anchor="w")
...
for environment in environments:
    r = Radiobutton(middle_frame, ...)
    r.pack(side="top", anchor="w")

使用grid

由于您要创建三列布局,grid 可能是更好的选择。关键是为所有三列赋予相同的权重,以便平均分配额外的空间。您还可以使用uniform 选项来确保它们的宽度完全相同。

在这种情况下,我建议只为单选按钮使用单个框架,以便它们的布局独立于 UI 的其余部分。

radio_frame = Frame(root)
radio_frame.pack(side="top", fill="both", expand=True)
radio_frame.grid_columnconfigure((0,1,2), weight=1, uniform="equal")

for row, device in enumerate(devices):
    r = Radiobutton(radio_frame, ...)
    r.grid(row=row, column=0, sticky="w")
...
for row, source in enumerate(sources):
    r = Radiobutton(radio_frame, ...)
    r.grid(row=row, column=1, sticky="w")
...
for row, environment in enumerate(environments):
    r = Radiobutton(radio_frame, ...)
    r.grid(row=row, column=2, sticky="w")

【讨论】:

  • 非常感谢!网格方法完美运行!
猜你喜欢
  • 2021-01-20
  • 2020-03-17
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 2015-12-27
  • 2021-12-19
  • 2017-01-10
相关资源
最近更新 更多