2016-06-20 329 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) 

這解決了眼前的問題,但你需要做同樣的事情,你的幀中的每一個,以及根窗口。對於每個包含由柵格管理的子項的幀,您至少需要給出一行和一列的權重。

由於您似乎試圖創建標籤和條目小部件的網格,因此您可能需要考慮使用單個框架而不是多個框架。通過使用單個框架,您不必嘗試猜測需要使用多少填充才能使所有內容排列起來。