ttk.Separator установить длину / ширину

Как установить / изменить длину / ширину объекта ttk.Separator в Tkinter?

        ttk.Separator(self, orient='horizontal').grid(column=0,
        row=0, columnspan=2, sticky='ew')

Кажется, что columnspan пытается выполнить эту работу, но когда у вас есть несколько разделителей с одинаковым значением столбца, они имеют разную длину - есть идеи, почему?

Вот простой пример быстрого «грязного» теста:

import ttk
from Tkinter import *

class myTestFrame(Frame):

    def __init__(self):

        Frame.__init__(self)

        self.master.title("My Test Frame")

        self.master.minsize(350, 150)
        self.grid(sticky=W+N+S+E)

        firstLayer      = Frame(self)
        firstLayer.pack(side="top", fill="x")
        secondLayer      = Frame(self)
        secondLayer.pack(side="top", fill="x")
        thirdLayer      = Frame(self)
        thirdLayer.pack(side="top", fill="x")

        labelText=StringVar()
        labelText.set("Enter your area zip code: ")
        labelDir=Label(firstLayer, textvariable=labelText, fg="black", font = "Calibri 10 bold")
        labelDir.grid(row=2, column=0, sticky="W")
        zipCode=IntVar(None)
        entryFieldFrame=Entry(firstLayer,textvariable=zipCode,width=5)
        entryFieldFrame.grid(row=2, column=1, sticky="W", padx=31)

        ttk.Separator(secondLayer, orient='horizontal').grid(column=0,
            row=0, columnspan=2, sticky='ew')

        labelText=StringVar()
        labelText.set("Enter your age: ")
        labelDir=Label(secondLayer, textvariable=labelText, fg="black", font = "Calibri 10 bold")
        labelDir.grid(row=2, column=0, sticky="W")
        age=IntVar(None)
        age.set(1.0)
        entryFieldFrame=Entry(secondLayer,textvariable=age,width=5)
        entryFieldFrame.grid(row=2, column=1, sticky="W", padx=83)

        ttk.Separator(thirdLayer, orient='horizontal').grid(column=0,
            row=0, columnspan=2, sticky='ew')

        labelText=StringVar()
        labelText.set("Enter your brother's age: ")
        labelDir=Label(thirdLayer, textvariable=labelText, fg="black", font = "Calibri 10 bold")
        labelDir.grid(row=2, column=0, sticky="W")
        brothersAge=IntVar(None)
        entryFieldFrame=Entry(thirdLayer,textvariable=brothersAge,width=5)
        entryFieldFrame.grid(row=2, column=1, sticky="W", padx=29)

if __name__ == "__main__":

    testFrame = myTestFrame()
    testFrame.mainloop()
 Bryan Oakley20 июн. 2016 г., 17:28
В примере, какой результат вы хотите? Должны ли разделители проходить полностью под метками, под метками и виджетами ввода, ...?
 Bryan Oakley20 июн. 2016 г., 16:32
пожалуйста, предоставьте mcve. То, что вы хотите сделать, почти наверняка возможно, но то, что вы хотите сделать, не очень понятно.
 schmi20 июн. 2016 г., 17:40
Также было бы приятно увидеть вариант, позволяющий перейти до конца оконной рамы
 schmi20 июн. 2016 г., 17:34
Я хочу, чтобы они шли до конца поля ввода
 schmi20 июн. 2016 г., 16:20
тогда возможно ли каким-то образом явно (пере) определить ширину разделителя, так как у меня есть разные столбцы с разными длинами, но все же хочется иметь разделители с одинаковыми шириной / длиной? Кажется, чтоpadx вариант в пределахсетка спецификация тоже не помогает.
 Bryan Oakley20 июн. 2016 г., 16:26
и да и нет. Есть, конечно, хитрости, которые вы можете сделать, например, поместить разделитель в рамку и затем установить размер рамки, но это редко требуется. Разделители предназначены для разделения элементов и обычно имеют одинаковую ширину или высоту элементов, которые они разделяют. Кажется, вы используете их для каких-то других целей, но в вашем вопросе недостаточно информации, чтобы предложить альтернативу. Пожалуйста, дайте mcve (stackoverflow.com/help/mcve), чтобы проиллюстрировать, как вам нужны разделители фиксированной ширины со столбцами переменной ширины.
 Bryan Oakley20 июн. 2016 г., 16:17
columnspan не влияет на ширинукак таковой, он просто определяет, сколько столбцов охватывает виджет. Фактическая ширина зависит от того, насколько велики столбцы.
 schmi20 июн. 2016 г., 16:29
Что ж, моя настройка довольно проста - у меня есть ряд меток и полей ввода (каждый из них содержит одну метку и поле ввода). Метки в каждом необработанном виде имеют разную длину / ширину - поэтому я хочу сгруппировать некоторые из этих строк с помощью разделителей (которые, мы надеемся, имели бы одинаковую длину), а не с использованием фреймов - это возможно, или я должен использовать Рамки?

Ответы на вопрос(1)

Решение Вопроса

что разделители слишком короткие, а в том, что вы не сказалиgrid что делать с дополнительным нераспределенным пространством. Ваши столбцы имеют такую ​​же ширину, как и должны быть, а ваш разделитель имеет ширину, равную столбцам, в которых он находится. В комментарии вы говорите: «Я хочу, чтобы они дошли до конца полей ввода», и это именно то, что нужно. они делают. То, что вы действительно хотите, чтобы все поля ввода заканчивались в одном месте.

Быстрое решение состоит в том, чтобы убедиться, что при использованииgridвы всегда даете по крайней мере одну строку и один столбец ненулевым весом. Это говоритgrid где выделить дополнительное пространство. В вашем случае вы этого не сделали, поэтому в третьей строке есть место, которое не используется справа от виджета ввода.

Быстрое и грязное решение здесь состоит в том, чтобы убедиться, что либо столбец 0, либо 1 получает дополнительное пространство. Обычно выбор состоит в том, чтобы дать это входному виджету. Итак, вы можете добавить это, чтобы улучшить ситуацию:

thirdLayer.grid_columnconfigure(1, weight=1)

Это решает непосредственную проблему, но вы должны сделать то же самое для каждого из ваших кадров, а также для корневого окна. Для каждого фрейма, содержащего дочерние элементы, управляемые сеткой, необходимо указать хотя бы одну строку и один столбец.

Поскольку вы, кажется, пытаетесь создать сетку из меток и виджетов ввода, вы можете рассмотреть возможность использования одного кадра, а не нескольких кадров. Используя один кадр, вам не нужно пытаться угадать, сколько отступов нужно использовать, чтобы все выстроилось в линию.

Ваш ответ на вопрос