ttk.Separator 设置 length/width
ttk.Separator set the length/width
如何在 Tkinter 中 set/change ttk.Separator 对象的 length/width?
ttk.Separator(self, orient='horizontal').grid(column=0,
row=0, columnspan=2, sticky='ew')
似乎 columnspan 试图完成这项工作,但是当您有多个具有相同 columnspan 的分隔符时,它们似乎具有不同的长度 - 知道为什么吗?
这是一个简单的快速临时 "dirty" 测试示例:
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()
您的问题不是分隔符太短,而是您没有告诉 grid
如何处理额外的 un-allocated space。您的列的宽度与它们需要的宽度完全一样,而您的分隔符的宽度与它所在的列一样宽。在评论中您说 "I want them to go till the end of the entry fields" 而这正是他们正在做的。您真正想要的是所有输入字段都在同一位置结束。
快速修复是确保当您使用 grid
时,您总是至少给一行和一列赋予 non-zero 权重。这告诉 grid
在哪里分配任何额外的 space。在您的情况下,您还没有这样做,因此在第三行中, space 在条目小部件的右侧确实未使用。
此处快速而肮脏的解决方案是确保第 0 列或第 1 列获得额外的 space。通常选择是将其交给输入小部件。所以,你可以添加这个来改善这种情况:
thirdLayer.grid_columnconfigure(1, weight=1)
这解决了眼前的问题,但您需要对每个帧以及根 window 执行相同的操作。对于包含由网格管理的 children 的每一帧,您需要至少为一行和一列赋予权重。
由于您似乎正在尝试创建标签和条目小部件的网格,因此您可能需要考虑使用单个框架而不是多个框架。通过使用单个框架,您不必尝试猜测使用多少填充来让所有内容对齐。
如何在 Tkinter 中 set/change ttk.Separator 对象的 length/width?
ttk.Separator(self, orient='horizontal').grid(column=0,
row=0, columnspan=2, sticky='ew')
似乎 columnspan 试图完成这项工作,但是当您有多个具有相同 columnspan 的分隔符时,它们似乎具有不同的长度 - 知道为什么吗?
这是一个简单的快速临时 "dirty" 测试示例:
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()
您的问题不是分隔符太短,而是您没有告诉 grid
如何处理额外的 un-allocated space。您的列的宽度与它们需要的宽度完全一样,而您的分隔符的宽度与它所在的列一样宽。在评论中您说 "I want them to go till the end of the entry fields" 而这正是他们正在做的。您真正想要的是所有输入字段都在同一位置结束。
快速修复是确保当您使用 grid
时,您总是至少给一行和一列赋予 non-zero 权重。这告诉 grid
在哪里分配任何额外的 space。在您的情况下,您还没有这样做,因此在第三行中, space 在条目小部件的右侧确实未使用。
此处快速而肮脏的解决方案是确保第 0 列或第 1 列获得额外的 space。通常选择是将其交给输入小部件。所以,你可以添加这个来改善这种情况:
thirdLayer.grid_columnconfigure(1, weight=1)
这解决了眼前的问题,但您需要对每个帧以及根 window 执行相同的操作。对于包含由网格管理的 children 的每一帧,您需要至少为一行和一列赋予权重。
由于您似乎正在尝试创建标签和条目小部件的网格,因此您可能需要考虑使用单个框架而不是多个框架。通过使用单个框架,您不必尝试猜测使用多少填充来让所有内容对齐。