2016-06-20 297 views
1

如何设置/更改Tkinter中ttk.Separator对象的长度/宽度?ttk.Separator设置长度/宽度

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

似乎columnspan试图做的工作,但是当你有多个分离器具有相同columnspan,他们似乎有不同的长度 - 任何想法,为什么?

下面是一个简单快速的ad-hoc“脏”的测试例子:

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

是否可以明确地(重新)定义分隔符的宽度,因为我有不同的长度不同的列,但是仍然希望具有相同的宽度/长度的分隔符?看起来,**网格**规范中的** padx **选项也无法提供帮助。 – schmi

+1

是和不是。当然有一些技巧可以做,比如把分隔符放在一个框架中,然后设置框架的大小,但这很少需要。分隔符被设计为分离项目,并且通常与它们分离的事物具有相同的宽度或高度。您似乎将其用于其他目的,但您的问题中没有足够的信息来建议替代方案。请给一个mcve(http://www.stackoverflow.com/help/mcve)来说明如何使用宽度可变列的固定宽度分隔符。 –

回答

2

你的问题不在于分离器是太短了,那就是你还没有告诉grid做什么用额外的未分配空间。你的列只有它们所需要的宽度,而且你的分隔符只有它所在的列的宽度。在评论中,你会说“我希望它们一直走到输入字段的末尾”,这正是他们在。你真正想要的是所有的输入字段在相同的位置结束。

快速解决方法是确保在使用grid时,您始终至少给出一行和一列为非零权重。这告诉grid在哪里分配任何额外的空间。在你的情况下,你还没有做到这一点,所以在第三行有空间,没有用于入口小部件的权利。

这里的快速和肮脏的解决方案是确保列0或1获得额外的空间。通常选择是将它提供给输入小部件。所以,你可以添加此改善情况:

thirdLayer.grid_columnconfigure(1, weight=1) 

这解决了眼前的问题,但你需要做同样的事情,你的帧中的每一个,以及根窗口。对于每个包含由栅格管理的子项的帧,您至少需要给出一行和一列的权重。

由于您似乎试图创建标签和条目小部件的网格,因此您可能需要考虑使用单个框架而不是多个框架。通过使用单个框架,您不必尝试猜测需要使用多少填充才能使所有内容排列起来。