Отделитель tkinter ttk не будет отображаться

Рассмотрим этот простой код:

from Tkinter import *
import ttk
root= Tk()
ttk.Label(root, text='Heading Here').grid(row=1, column=1)
ttk.Separator(root,orient=HORIZONTAL).grid(row=2, columnspan=5)
root.mainloop()

Когда я запускаю этот код, разделитель почти невидим.
ttk separator not visible
Я отметил его красной стрелкой, если вы видите ее как маленькую точку.

Как сделать разделитель охватывать всю ширину горизонтали или, по крайней мере, быть видимым?

Ответ 1

Сепаратор имеет естественную ширину 1 пиксель. Вы сказали ему зарезервировать пространство на пять столбцов, но вы не просили, чтобы разделитель фактически заполнил эти пять столбцов. Чтобы решить эту проблему, поставьте sticky атрибут, в котором говорится: "Если для этого виджета больше места, чем необходимо для этого виджета, сделайте края виджета" привязаны "к определенным сторонам его контейнера".

В этом случае вы хотите, чтобы разделитель был прикреплен к левому и правому краям его контейнера. Липкие атрибуты используют точки компаса для значений, поэтому вы хотите "e" для востока и "w" для запада:

ttk.Separator(...).grid(..., sticky="ew")

Ответ 2

@Bryan sticky решение прекрасно, но оно решает только часть корпуса, так как разделитель не будет покрывать всю ширину горизонтали (что вы просили). Вот альтернативное решение, которое вы можете применить: Вместо .grid() используйте макет place() и полностью контролируйте положение, ширину (длину) и даже высоту разделителя. Чтобы просто применить это к настоящему случаю (без какой-либо дополнительной функции) и покрыть полную горизонтальную ширину, просто:

замещать

ttk.Separator(root,orient=HORIZONTAL).grid(row=2, columnspan=5)

с

ttk.Separator(root).place(x=0, y=26, relwidth=1)

Вы можете установить "y" по своему усмотрению. Также обратите внимание, что orient=HORIZONTAL не требуется, так как это опция по умолчанию. (Проверьте http://effbot.org/tkinterbook/place.htm подробности и примеры использования макета '.option().)