Поместите вертикальную линию сетки между столбцами в середине окна в Python Tkinter

Это немного сложно, но я постараюсь объяснить:
скажем, например, у меня есть сетка с 4 метками, когда у меня есть 2 строки и 2 столбца (см. изображение ниже). Я пытаюсь сделать вертикальную линию между столбцами 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 аргументы, когда я помещаю элементы в сетку, а также пытался поместить каждую строку и каждый столбец в свой собственный фрейм, но все решения не помогли мне ,
Как я могу заставить это работать? Надеюсь, мое объяснение было ясно, и спасибо заранее (;

Всего 3 ответа


Вы можете просто поместить четыре изображения / метки вместе во Frame (или любой другой элемент контейнера), а затем расположить этот фрейм горизонтально и вертикально по центру в root фрейме.

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

Не забудьте изменить родительский элемент меток с root на c , т. Label(c, ...) .

Обновление: но это не центрирует линию между красным и зеленым блоком к кадру. Вы можете комбинировать это с

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

введите описание изображения здесь


Вы можете использовать виджет 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 столбца, 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) 

Есть идеи?

10000