首页 > 解决方案 > 如何对齐相邻行tkinter中的单选按钮?

问题描述

我正在用 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")

标签: pythontkinter

解决方案


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

如果是这种情况,并且您想继续使用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")

推荐阅读