Поместите вертикальную линию сетки между столбцами в середине окна в Python Tkinter - PullRequest
2 голосов
/ 15 мая 2019

Это немного сложно, но я постараюсь объяснить:
скажем, например, у меня есть сетка с 4 метками, когда у меня есть 2 строки и 2 столбца (см. Изображение ниже).Я пытаюсь сделать вертикальную линию между столбцами 1 и 2 (красная линия на изображении), чтобы она была линией, разделяющей окно на две равные половины.image example

Ниже приведен пример моего исходного кода.
Редактировать: Обратите внимание, что элементы являются метками только для примера, но в моемисходный код, они на самом деле все разные (некоторые кадры, некоторые изображения, некоторые кнопки и т. д.)

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 (красная линия на изображении) находится далеко не в центре окна.

running the code

Затем я попытался добавить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()

Но теперь у меня другая проблема, когда столбцы не соприкасаются друг с другом.

running code with changes

Я также пытался решить проблему, добавляя аргументы sticky при размещении элементов в сетке, а также пытался поместить каждую строку и каждый столбец в свой фрейм, но всерешения не сработали для меня.
Как я могу заставить это работать?Надеюсь, мои объяснения были ясны, и спасибо заранее (;

Ответы [ 3 ]

1 голос
/ 15 мая 2019

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

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

0 голосов
/ 15 мая 2019

Поскольку имеется 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)
0 голосов
/ 15 мая 2019

Вы можете использовать виджет 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...