2016-06-20 9 views
1

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

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

Кажется, что ColumnSpan пытается сделать эту работу, но когда у вас есть несколько сепараторов с тем же 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() 
+1

'columnspan' не влияет на ширину _per se_, он просто определяет, сколько столбцов занимает виджет. Фактическая ширина зависит от того, насколько велики столбцы. –

+0

, то почему-то можно явно (re) определить ширину разделителя, так как у меня разные столбцы с разными длинами, но все же вы хотите иметь разделители с SAME width/length? Похоже, что опция ** padx ** в спецификации ** grid ** также не помогает. – schmi

+1

да и нет. Есть, конечно, трюки, которые вы можете сделать, например, поместить разделитель в кадр, а затем установить размер кадра, но это редко требуется. Сепараторы предназначены для разделения элементов и, как правило, имеют одинаковую ширину или высоту того, что они разделяют. Кажется, что вы используете их для какой-то другой цели, но в вашем вопросе недостаточно информации, чтобы предложить альтернативу. Пожалуйста, дайте mcve (http://www.stackoverflow.com/help/mcve), чтобы проиллюстрировать, как вам нужны разделители фиксированной ширины с столбцами переменной ширины. –

ответ

2

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

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

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

thirdLayer.grid_columnconfigure(1, weight=1) 

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

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