在Python Tkinter的窗口中间的列之间放置网格垂直线

时间:2019-05-15 07:55:24

标签: python python-3.x tkinter

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

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

val nested_fields = df.schema("b2").fieldNames.toList

此代码可以使每个标签的垂直和水平中心线达到我想要的完美,但是第1列和第2列之间的垂直线(图像中的红线)离窗口的中心很近。

running the code

然后,我尝试将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() 函数添加到我的代码中:

grid_columnconfigure

但是现在我有一个不同的问题,列之间彼此不接触。

running code with changes

我还尝试通过在将元素放入网格中时添加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() 参数来解决此问题,并且还尝试将每一行和每一列都放在自己的框架中,但是所有解决方案对我不起作用。
我该如何工作?希望我的解释清楚,并在此先感谢(;

3 个答案:

答案 0 :(得分:1)

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

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

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

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

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

enter image description here

答案 1 :(得分:0)

您可以使用ttk.Separator小部件。 您应该使用以下代码部分:

import tkinter.ttk
import tkinter as tk

root = tk.Tk()

---etc---
---etc---
---etc---

tkinter.ttk.Separator(master, orient=VERTICAL).grid(column=1, row=0, rowspan=2, sticky='ns')

root.mainloop()

您可以使用“ grid_info”方法获取小部件的网格信息。

row    = widget.grid_info()['row']      # Row of the widget
column = widget.grid_info()['column']   # Column of the widget

答案 2 :(得分:0)

由于有2列,所以root.grid_columnconfigure(0, weight=1)仅影响第一列。 试试

for n in range(2):
    root.grid_columnconfigure(n, weight=1)

root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=1)