首页 > 解决方案 > 在 Python Tkinter 的窗口中间的列之间放置一条网格垂直线

问题描述

这有点复杂,但我会尽力解释:
例如,当我有 2 行和 2 列时,我有一个带有 4 个标签的网格(见下图)。我正在尝试使第 1 列和第 2 列之间的垂直线(图像中的红线)成为将窗口分成相等两半的线。 图像示例

您可以在下面看到我的初始代码示例。
编辑:请注意,这些元素只是例如标签,但在我的原始代码中,它们实际上都是不同的(有些是框架、一些图像、一些按钮等)

import tkinter as tk

root = tk.Tk()

label1 = tk.Label(root, text=1, width=8, height=2, bg="red")
label1.grid(row=0, column=0)

label2 = tk.Label(root, text=2, width=10, height=3, bg="green")
label2.grid(row=0, column=1)

label3 = tk.Label(root, text=3, width=5, height=4, bg="blue")
label3.grid(row=1, column=0)

label4 = tk.Label(root, text=4, width=6, height=2, bg="yellow")
label4.grid(row=1, column=1)

root.mainloop()

这段代码使每个标签的垂直和水平中心线如我所愿,但第 1 列和第 2 列之间的垂直线(图像中的红线)离窗口的中心很远。

运行代码

然后,我尝试将grid_columnconfigure函数添加到我的代码中:

import tkinter as tk

root = tk.Tk()
root.grid_columnconfigure(0, weight=1)  # the line I've added

label1 = tk.Label(root, text=1, width=8, height=2, bg="red")
label1.grid(row=0, column=0)

label2 = tk.Label(root, text=2, width=10, height=3, bg="green")
label2.grid(row=0, column=1)

label3 = tk.Label(root, text=3, width=5, height=4, bg="blue")
label3.grid(row=1, column=0)

label4 = tk.Label(root, text=4, width=6, height=2, bg="yellow")
label4.grid(row=1, column=1)

root.mainloop()

但现在我有一个不同的问题,列不相互接触。

运行带有更改的代码

我还尝试通过sticky在将元素放置在网格中时添加参数来解决此问题,并且还尝试将每一行和每一列放在它们自己的框架中,但所有解决方案都不适合我。
我怎样才能让它工作?希望我的解释清楚,并提前感谢(;

标签: pythonpython-3.xtkinter

解决方案


您可以将四个图像/标签一起放入一个Frame(或任何其他容器元素)中,然后将该框架水平和垂直居中在您的root框架中,并使用place.

c = tk.Frame(root, bg='white')
c.place(relx=0.5, rely=0.5, anchor='center')

不要忘记将标签的父级从 更改rootc,即Label(c, ...)

更新:但这不会使红色和绿色块之间的线与框架居中。您可以将其与uniform使列的宽度相等,但是中心和较薄的列之间会有一些填充...

for n in (0, 1):
    c.grid_columnconfigure(n, uniform="foo")

在此处输入图像描述


推荐阅读