我有一个包含五列的主框架,我希望它始终保持相同的宽度,无论窗口的大小如何调整。有三行,底部是按钮。
问题是当我将Text小部件添加到较大的Frame 3时,它将列2,3和4中的列宽扩展为宽于0和0的列宽。 1。
我试图通过确保将所有列权重设置为相等来处理此问题,但这只会在调整主窗口大小时帮助保持列保持其相对大小。它不会强制列与实例化主数据时相同。
我尝试使用self.columnconfigure(c,minsize=100)
,这使我在实例化对象时看起来宽度均匀。但是,如果我将窗口调整得更大,那么三个右手柱的扩展速度比左侧两列更快,尽管它们都被分配了相同的重量!如果我将窗口缩小两个,为了保持宽度的“minsize”,最右边的列不可见。所以这不是一个解决方案。
def __init__(self, master=None):
Frame.__init__(self, master)
self.master.rowconfigure(0, weight=1)
self.master.columnconfigure(0, weight=1)
self.grid(sticky=W+E+N+S)
""" Establish grids, columns for the master Frame widget """
for c in range(5):
# 0,1,2,3,4
self.columnconfigure(c, weight=1)
self.rowconfigure(0, weight = 1)
self.rowconfigure(1, weight = 1)
self.rowconfigure(2, weight = 0)
""" Generate Buttons """
self.button = dict()
for r in range(5):
self.button[r]=Button(self)
self.button[r].grid(column=r, row=2, sticky=N+S+E+W)
self.button[0].config(command=self.b0, text="red")
self.button[1].config(command=self.b1, text="blue")
self.button[2].config(command=self.b2, text="green")
self.button[3].config(command=self.b3, text="black")
self.button[4].config(command=self.b4, text = "open")
继续
""" Frame 1 """
self.f1 = Frame(self, bg="red")
self.f1.grid(row=0, column=0, columnspan=2,rowspan=1, sticky=N+S+W+E)
self.f1.bind("<Button-1>", self.f1_button)
"""didn't help"""
#self.f1.columnconfigure(0, weight=1)
#self.f1.columnconfigure(1, weight=1)
self.label_1_var = StringVar()
self.label_1_var.set("frame 1")
self.label_1 = Label(self.f1, textvariable=self.label_1_var)
self.label_1.grid(row=1, column=1)
""" Frame 2 """
self.f2 = Frame(self, bg="blue")
self.f2.grid(row=1, column=0, columnspan=2,rowspan=1, sticky=N+S+E+W)
self.f2.bind("<Button-1>", self.f2_button)
"""didn't help"""
#self.f2.columnconfigure(0, weight=1)
#self.f2.columnconfigure(1, weight=1)
self.label_2_var = StringVar()
self.label_2_var.set("frame 2")
self.label_2 = Label(self.f2, textvariable = self.label_2_var)
self.label_2.grid(row=1, column=1)
继续
""" frame 3 """
self.f3 = Frame(self, bg="green")
self.f3.grid(row=0, column=2, columnspan=3, rowspan = 2, sticky=N+S+E+W)
self.f3.rowconfigure(0,weight=1)
self.f3.rowconfigure(1,weight=0)
self.f3.columnconfigure(0, weight=1)
"""list some files to try"""
files = glob.glob("*")
default_display =""
for fn in files:
default_display += fn + "\n"
""" Text widget """
self.f3_text = Text(self.f3)
self.f3_text.insert(END, default_display)
self.f3_text.grid(column=0, row=0,sticky=N+S+E+W)
""" Text scrollbar """
self.sb = Scrollbar(self.f3)
self.sb.grid(column=1, row=0, sticky=N+S+E+W)
self.f3_text.config(yscrollcommand=self.sb.set)
self.sb.config(command=self.f3_text.yview)
""" Entry Window """
self.f3_entry = Entry(self.f3)
self.f3_entry.grid(column=0, row=1, columnspan=2, sticky=N+S+E+W)
答案 0 :(得分:1)
一个简单的解决方案是将窗口小部件的宽度和高度设置为1
,然后依靠网格选项来拉伸它以填充其容器。由于它的自然尺寸小于它所处的细胞,它不会导致细胞生长。
答案 1 :(得分:0)
您想要设置文本小部件的宽度:
text = Text(frame, width=20)
默认情况下,宽度设置为80个字符。 请注意,此值不是常量,因此窗口小部件的大小调整正确。
答案 2 :(得分:-1)
虽然依靠自动Tk-GUI-MVC-Visual Part公开的最常见公共方法的行为/服务会很棒,但真实的布局复杂性可能让我们陷入死胡同。
尝试硬编码编程方式,从Tk-GUI自动临时重新计算/重新构建Tk-GUI-MVC-Visual Part来自新的,已更改的内部值-MVC-控制器部分:
master.bind( '<Configure>', aResizeCallbackHANDLER( ) ) # MVC-Controller Part TRIGGER
def aResizeCallbackHANDLER( self, anEvent ): # Reactor:
# inspect <anEvent>.{} # .bind()-bound actor
# and <anEvent>.widget.{} # details from
# incl. <anEvent>.widget.<Tree-sub-element>.{} # Tk-GUI-MVC-Model Part
#
# <anEvent>.widget <-- system-assigned <widget>-instance
# .height on-{ <Configure> }
# .width on-{ <Configure> }
# .serial <-- system-assigned Integer
# .time <-- system-assigned Integer ( .inc each msec )
# .
# ..
# ...
# Act upon changes and enforce new, re-calculated values
# into sub-ordinated geometry
# ...
#
这个原则健壮并且不依赖于任何&#34;隐藏&#34; Tk-GUI-MVC元素的相互关系。